개발을 하면서 가장 자주 접하는 쿼리 유형 중에

SELECT * FROM [TABLE] A
WHERE TO_CHAR(A.DATECOLUMN, 'YYYYMMDD') = '20100112'

위와 같이 날짜를 기준으로 값을 뽑아내는 것이 많다.

TO_CHAR과 같은 함수가 아무리 시간이 적게 든다고 해도, WHERE 문을 충족하는지를 검사하기 위해 모든 DATECOLUMN 컬럼의 값을 치환하다보면 그 ROW 수가 커질수록 부하가 커질수밖에 없다.
또한, DATECOLUMN에 인덱스를 생성해 두었을 경우. TO_CHAR 함수로 변형되었으므로, 기껏 인덱스를 생성해 두고 사용하지 못하게 된다.
* 탐색 시 인덱스가 사용되지 않는 경우는 이곳을 참고하자.

오늘 얻은 팁은
위의 쿼리를 다음과 같이 바꾸는 것이다.

SELECT * FROM [TABLE] A
WHERE
A.DATECOLUMN >= TO_DATE('20100112', 'YYYYMMDD')
           AND A.DATECOLUMN < TO_DATE('20100113', 'YYYYMMDD')

이렇게 하면 모든 DATECOLUMN의 모든 행의 값에 대해 연산을 적용할 필요가 없으며 인덱스도 잘 동작하기 때문에 쿼리에 소요되는 시간을 단축할 수 있다.


덧.
이것이 진리다! 가 아니라 이런 컨셉을 잊지 않고 있으면 좋을 것 같아서 적어 놓았다.
요새 계속 디비를 접하면서 느끼는 거지만, 진짜 신세계가 따로 없다. ㅋㅋ
저작자 표시 비영리
신고
posted by purecolor


티스토리 툴바