쿼리 인덱스 관련 질문 있습니다. 0 1 112

by 메로나 [SQL Query] [2020.05.20 13:31:28]


프록그램에서 패키지의 쿼리를 호출하여 조회 되는데
넘겨 받는 인자가 p_item. from_dt, to_dt, ... 등이 있습니다.
p_item이 있을경우 해당 테이블T에서 전체데이터에 대해서 p_item 값으로 인덱스를 타서 조회가 됩니다.
만약 p_item이 없을 경우는 from_dt와 to_dt로 T테이블에서 기간범위가 주어져서 조회가 됩니다.


SELECT
    ...
FROM T
WHERE 1=1
    AND ...
    AND ...
    (
          (
                -- A
                p_item IS NULL 
                AND 1=1
          )      
          OR
          
          (
                -- B
                p_item IS NOT NULL
                AND item IN (
                                SELECT REGEXP_SUBSTR('A,B,C', '[^,]+', 1, LEVEL)
                                FROM DUAL 
                                CONNECT BY REGEXP_SUBSTR('A,B,C', '[^,]+', 1, LEVEL) IS NOT NULL
                            )
          )
)


이럴경우 조회가 인덱스 안타는지 한참 걸립니다.
쿼리에 B조건만 WHERE절에 두면 INDEX 중에 5번을 타면서 조회가 빨리 되구요
저렇게 2개의 조건에 따른처리 들어가니 인덱스를 안타는지 오래 걸립니다.
USE_CONCAT 이나 그런거 써서 해야 되나요?

by 마농 [2020.05.20 14:39:02]

실행계획이 두가지 실행계획으로 분리되어 있는지 확인해 보세요.
USE_CONCAT 힌트도 사용해 보세요.
아예 UNION ALL 형태로 쿼리를 변경해 보세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입