Index 아닌 쿼리 실행시간 줄이기

geonu·2022년 2월 16일
0
post-thumbnail
post-custom-banner

문제

서브 쿼리, 조인, 계산식이 복잡하게 쓰인 쿼리가 있다.
실행시간은 7.388s.
통계 수치 조회 쿼리인데 실행시간이 너무 길다.

실행시간을 줄이기 위해 Index에 대해 생각하던 중 의도치 않게 다른 부분에서 실행시간이 10배 이상 줄어드는 것을 경험하게 되어 리뷰하고자 한다.

해결방법

to_char(TARGET_DT,'YYYYMMDD') = to_char(SYSDATE,'YYYYMMDD') 

문제의 쿼리 중 날짜조건이 위와 같이 사용되었다.

TARGET_DT의 타입은 timestamp, SYSDAT의 타입은 date이다.
하지만 위의 쿼리는 둘 다 문자열로 변환 후 비교하고 있다.

TARGET_DT >= TRUNC(SYSDATE) AND  TARGET_DT < TRUNC(SYSDATE+1)

쿼리를 이와 같이 수정했고 실행시간은 0.6s가 나왔다.

느낀점

위 쿼리는 700만건 이상의 데이터를 가진 테이블을 조회하는 쿼리였다. 700만건의 TARGET_DT를 문자열로 변환하는 과정에 많은 시간이 소요된 걸로 보인다.

불필요한 변환과정을 뺀 것만으로도 실행속도가 7.388s -> 0.6s로 줄었다. 쿼리 속도 향상에 Index 중요하다고 들어왔고 실제로도 중요했다. 그래서 Index 위주의 생각만 해왔다.
하지만 위 경험을 통해 Index 이외의 변화에도 쿼리 실행속도에 큰 영향을 미칠 수 있다는 것을 느꼈다.

추가

Index 이외의 쿼리 실행 속도에 영향을 미치는 것

  1. where 조건문 순서 변경
    단순히 조건의 순서에 따라 실행 속도는 차이가 나지 않는다.
    하지만 조건 컬럼이 Index 컬럼이거나 아니면 옵티마이저에 의한 속도 차이는 발생할 수 있다.

  2. date 검색 시 between 대신 >=, <= 사용

참고

SYSDATE
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions172.htm
옵티마이저와 실행계획
https://dataonair.or.kr/db-tech-reference/d-guide/sql/?mod=document&uid=354

profile
시작이 있어야
post-custom-banner

0개의 댓글