API_IF_개발

오라클에서 BETWEEN과 부등호(>=, <=) 성능 차이: 어떤 게 더 빠를까?

피오농부 2025. 3. 29. 05:41
반응형

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';
    

🔎 실행계획 차이

조건 실행계획 가능성

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에서는 가독성 위주로 선택하되, 커버 인덱스 여부 확인
반응형