문제
서브 쿼리, 조인, 계산식이 복잡하게 쓰인 쿼리가 있다.
실행시간은 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 이외의 변화에도 쿼리 실행속도에 큰 영향을 미칠 수 있다는 것을 느꼈다.
추가
where 조건문 순서 변경
단순히 조건의 순서에 따라 실행 속도는 차이가 나지 않는다.
하지만 조건 컬럼이 Index 컬럼이거나 아니면 옵티마이저에 의한 속도 차이는 발생할 수 있다.
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