[Oracle SQL] 날짜 데이터 필터링하는 4가지 방법
들어가며
데이터베이스에서 날짜 데이터를 기준으로 필터링할 때, 쿼리문을 효율적으로 작성하지 않으면 조회 시간이 매우 늘어납니다. 이 글에서는 Oracle SQL로 날짜 데이터를 필터링하는 4가지 방법을 소개합니다.
이 글에서 활용할 예제 데이터는 다음과 같이 OCR_TM이라는 DATE 형식이 포함된 데이터입니다. OCR_TM을 기준으로 1일 치 데이터를 필터링하는 4가지 방법을 소개합니다.
- SOL 1 - TRUNC, TO_DATE
- SOL 2 - TO_CHAR
- SOL 3 - BETWEEN, TO_DATE
- SOL 4 - 부등호, TO_DATE
SOL 1 - TRUNC, TO_DATE
첫 번째 방법은 TRUNC와 TO_DATE를 활용하는 방법입니다. OCR_TM은 연월일 시분초까지 표현된 컬럼이므로 YYYY-MM-DD와 같은 형식에 맞춰 절삭 후 필터링하는 방법입니다. 하지만, OCN_TM 컬럼의 모든 값을 TRUNC 함수로 변환하여 비교하므로 인덱스를 사용할 수 없어 성능 저하를 초래할 수 있습니다.
SELECT *
FROM TEST_DB
WHERE TRUNC(OCR_TM) = TO_DATE('2020-08-11', 'YYYY-MM-DD')
;
SOL 2 - TO_CHAR
두 번째 방법은 타입을 문자 형태로 변환하여 필터링하는 방법입니다. TO_CHAR를 활용하여 문자 형태로 변환 후 조회합니다. 이 방법 또한, OCN_TM 컬럼의 값을 문자형으로 변환하여 비교하므로 인덱스 활용이 불가능합니다.
SELECT *
FROM TEST_DB
WHERE TO_CHAR(OCR_TM, 'YYYYMMDD') = '20200811'
;
SOL 3 - BETWEEN, TO_DATE
세 번째 방법은 BETWEEN과 TO_DATE를 활용하는 방법입니다. 필터링하고자 하는 날짜의 00시 00분 00초부터 23시 59분 59초에 맞춰 BETWEEN을 활용하여 필터링 후 조회합니다. OCN 컬럼의 범위를 지정하기 때문에 인덱스 활용은 가능하지만 끝나는 시간이 23:59:59 이후 ms 단위의 데이터가 존재한다면 포함하지 못할 수 있으므로 주의가 필요합니다.
SELECT *
FROM TEST_DB
WHERE OCR_TM BETWEEN TO_DATE('2020-08-11 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND TO_DATE('2020-08-11 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
;
SOL 4 - 부등호, TO_DATE
네 번째 방법은 부등호와 TO_DATE를 활용하는 방법입니다. 조회하고자 하는 날짜인 D-DAY와 D+1을 부등호로 표현하여 필터링 후 조회합니다. 이 방법은 시작 시간과 끝 시간을 명확하게 지정하여 범위를 설정하므로 인덱스 활용도 가능할 뿐만 아니라 누락되는 데이터 없이 조회가 가능합니다.
SELECT *
FROM TEST_DB
WHERE OCR_TM >= TO_DATE('2020-08-11', 'YYYY-MM-DD')
AND OCR_TM < TO_DATE('2020-08-12', 'YYYY-MM-DD')
;
위 네 가지 쿼리 중 가장 추천하는 방법은 SOL 3 또는 SOL 4입니다. 데이터베이스의 옵티마이저를 통해 계산한 COST 결과, 크게 차이는 없지만 SOL 3과 SOL 4가 가장 낮은 COST가 산출된 것을 확인할 수 있습니다.
쿼리 | COST |
SOL 1 | 184,822 |
SOL 2 | 184,645 |
SOL 3 | 184,292 |
SOL 4 | 184,292 |
'Etc' 카테고리의 다른 글
논문 일기 1편 - 주제 탐색 (0) | 2025.02.06 |
---|---|
[모니터링] 파이썬을 활용한 메모리 사용량 확인 - psutil, sys (2) | 2025.01.07 |
[KoNLPy] Mac에서 KoNLPy 설치 - OpenJDK부터 Java 설정까지 (0) | 2025.01.01 |
[도커] Docker 명령어 아카이브 (0) | 2024.12.16 |
논문 일기 2편 - 주제 선정 (0) | 2024.07.15 |