쿼리 속도 질문입니다 0 6 792

by 한결 [SQL Query] [2017.09.07 12:02:46]


쿼리 속도가 느려서 질문드립니다.

테이블은 아래 구성과 같고,

    SEQ_NO                    NVARCHAR2(36  )    NOT NULL,      
    CALL_DATE              NVARCHAR2(8   )    ,  
    CALL_TIME              NVARCHAR2(6   )    ,        
    TEL_NO                    NVARCHAR2(128 )    ,

   기타 몇개 칼럼들...

 

INDEX 는 PK INDEX와 CALL_DATE, CALL_TIME, TEL_NO로  INDEX2가 존재합니다.

 

데이터 분포도는 아래 참조..

 

데이터는 하루에 10만건 이상 쌓이고(CALL_DATE 기준),

TEL_NO는 제각각 입니다.

하루에 한번씩 90일 이전 데이터는 배치로 삭제시키고 있습니다.

 

조회 쿼리는 아래와 같습니다.

SELECT SEQ_NO, TEL_NO
  FROM TABLE_NAME
WHERE CALL_DATE >= '20170825'
     AND CALL_DATE <= '20170825'
     AND CALL_TIME >= Rpad('0000', 6, '00')
     AND CALL_TIME <= Rpad('2359', 6, '59')
     AND TEL_NO LIKE Concat('01011112222', '%');

 

DB 툴에서 조회시 1초 내외로 조회되는데,

AND TEL_NO LIKE Concat(:A, '%');

 

이렇게 조회하는 경우 3분 넘게 걸립니다.

 

어떻게 튜닝을 해야될련지요,,,

고객사에 아직 가보지 않아 실행계획은 어떻게 나오는지 확인하지 못한 상황입니다.

 

 

by jkson [2017.09.07 12:18:38]

이런 경우 대부분 묵시적 형변환이 문제가 되던데

입력되는 파라메터의 형태가 묵시적 형변환을 일으키는 것은 아닌지 확인해보셔야 할듯합니다.

혹은 call_date 부분도 파라메터일 것 같은데 혹시 최초 실행계획 작성시 탐색 범위가 넓어

테이블 풀스캔으로 실행계획이 생성된 것은 아닌지 확인해보셔야할 것 같구요.

해당 쿼리가 짧은 기간만 조회하는 경우라면 index 힌트를 주시는 게 나을 듯하네요.


by 마농 [2017.09.07 12:33:01]

tel_no 조건이 입력될 때와 입력되지 않았을 때의 실행계획을 분리시켜야 합니다.
   AND (:v_tel_no IS NULL OR tel_no = :v_tel_no)
tel_no 항목에 널이 없다고 가정하면 아래처럼 해도 됩니다.
   AND tel_no = NVL(:v_tel_no, tel_no)


by 한결 [2017.09.07 12:54:34]

답변 감사합니다.

LIKE 조건이면  

AND (:v_tel_no IS NULL OR tel_no LIKE CONCAT(NVL(:v_tel_no, tel_no), '%'))

AND tel_no LIKE CONCAT(NVL(:v_tel_no, tel_no), '%')

이렇게 하면 되는건가요?

 

데이터에 TEL_NO 값은 있는것도 있고 없는것도 있지만,

조회조건에 TEL_NO 값은 필수로 들어옵니다.


by 마농 [2017.09.07 13:03:37]

LIKE 가 정말 LIKE 검색을 하려고 만든건지?
tel_no 조건의 입력 여부와 관계 없이 동작하게 하려고 붙인건지?
그 작성 의도를 정확히 파악해야 하겠죠.
정말로 LIKE 검색을 위한 것이라면?
AND (:v_tel_no IS NULL OR tel_no LIKE :v_tel_no || '%')


by 한결 [2017.09.07 13:21:19]

네, LIKE 검색을 하려고 존재합니다. 전화번호를 정확히 모를 경우.


by 우리집아찌 [2017.09.07 13:23:24]

TEL_NO 만 조회하면  FULL SCAN 탈거 같은데요

실행계획 보셔야할듯

저같으면 업무적으로 INDEX 첫번째 컬럼을 강제로 조회조건에 넣겠습니다.

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