반응형
Oracle SQL 쿼리 성능을 고민하다 보면, WHERE 절에 조건을 줄 때 BETWEEN을 쓰는 게 더 빠를까?, 아니면 >= 또는 <= 같은 부등호가 더 나을까 고민되는 경우가 많죠.
특히, 수백만 건의 데이터를 대상으로 날짜 조건을 줄 때 성능 차이가 눈에 띄기도 합니다.
이 글에서는 실제 예시와 함께 Oracle, MySQL, MSSQL 각각의 처리 방식과 성능 차이, 그리고 BETWEEN과 부등호의 최적 사용법까지 정리해드립니다.
🔍 실무에서 발견한 현상
- 수백만 건의 데이터가 있는 Oracle 테이블에서 날짜 조건 필터링 시,
- WHERE DT BETWEEN '20250324' AND '20250327'을 사용할 경우,
- WHERE DT >= '20250324' 또는 DT >= '20250324' AND DT <= '20250327'보다 더 빠른 응답 시간을 보임
🧠 오라클(Oracle)에서 BETWEEN이 빠른 이유
✅ 인덱스 처리 방식 차이
Oracle은 기본적으로 B*Tree 인덱스를 사용하는데,
BETWEEN 조건은 옵티마이저가 명확한 범위(RANGE SCAN)를 인식하기 때문에 다음과 같은 특징이 있습니다:
- BETWEEN: 인덱스 RANGE SCAN으로 처리되어 빠름
예: - SELECT * FROM MY_TABLE WHERE DT BETWEEN '20250324' AND '20250327';
- >=, <= 부등호 사용 시:
- 범위가 너무 넓거나 통계 정보 부족 시 TABLE FULL SCAN을 선택할 수도 있음
예:
SELECT * FROM MY_TABLE WHERE DT >= '20250324';
- 범위가 너무 넓거나 통계 정보 부족 시 TABLE FULL SCAN을 선택할 수도 있음
🔎 실행계획 차이
조건 실행계획 가능성
BETWEEN | INDEX RANGE SCAN (빠름) |
>= 또는 <= | INDEX SKIP SCAN, RANGE SCAN, 또는 TABLE FULL SCAN |
👉 범위가 명확하고 인덱스가 잘 설계되어 있다면 BETWEEN이 더 예측 가능하고 빠릅니다.
💡 MySQL에서는 어떤 차이가 있을까?
- MySQL은 내부적으로 BETWEEN을 >= AND <=와 동일하게 처리
- 옵티마이저가 단순하므로 조건이 명확할수록 성능이 좋음
- 단, 함수 사용 시 인덱스를 타지 못함
❌ 인덱스 못 타는 예:
WHERE UNIX_TIMESTAMP(DT) >= 1700000000
✅ 인덱스 타는 예:
WHERE DT >= FROM_UNIXTIME(1700000000)
🧩 MSSQL에서는?
- MSSQL은 옵티마이저가 BETWEEN과 >= AND <= 조건을 거의 동일하게 처리
- 실행 계획에 큰 차이 없음
- 커버링 인덱스, 추가 조건에 따라 성능 차이 발생 가능
📌 BETWEEN vs 부등호 정리 비교표
항목 BETWEEN >=, <= 부등호
인덱스 활용 | 범위 명확해 인덱스 RANGE SCAN 유리 | 조건이 애매하면 FULL SCAN 가능성 |
성능 | 범위 좁고 인덱스 있으면 빠름 | 범위 넓을 땐 오히려 더 빠를 수도 있음 |
가독성 | 간결하고 명확 | 조건이 유연하지만 복잡할 수 있음 |
DBMS 차이 | Oracle에선 BETWEEN 우위 | MySQL/MSSQL은 큰 차이 없음 (단, 함수 사용 주의) |
✅ 실무 적용 팁
- Oracle에서 날짜 조건은 BETWEEN을 우선 고려
- 범위가 넓거나 인덱스 미비 시 실행계획 꼭 확인
- MySQL에서는 UNIX_TIMESTAMP(컬럼)처럼 컬럼에 함수 쓰면 성능 저하 주의
- MSSQL에서는 가독성 위주로 선택하되, 커버 인덱스 여부 확인
반응형
'API_IF_개발' 카테고리의 다른 글
Spring 웹 애플리케이션에서 클라이언트 IP 접속 제한하는 방법 (1) | 2025.06.09 |
---|---|
웹프로그래머로 전향할 때 유용했던 자료 링크 모음 (0) | 2025.05.25 |
[MySQL 5.5] SQL Error (2003) 원격 접속 오류 해결 방법 (127.0.0.1 연결 실패) (0) | 2025.04.22 |
MyBatis BindingException 오류 해결법 총정리: MapperRegistry 문제부터 Spring 연동까지 (0) | 2025.04.12 |