WHERE 절 조건의 순서가 성능에 영향을 줄까?

Posted by heoncode
2025. 4. 10. 09:10 SQL 기초 정리
반응형
SMALL

SQL 쿼리를 작성할 때 WHERE 절 안의 조건 순서를 신경 써야 할까요? 예를 들어 다음 두 쿼리는 조건 순서만 다를 뿐 동일한 결과를 반환합니다.

SELECT * FROM employees
WHERE salary > 5000 AND department_id = 10;

SELECT * FROM employees
WHERE department_id = 10 AND salary > 5000;

논리적으로는 동일하지만, 실행 성능은 달라질 수 있습니다. 그 이유는 바로 오라클 옵티마이저(Optimizer)가 실행 계획을 생성할 때 조건 순서를 고려하기 때문입니다.

옵티마이저는 어떻게 조건을 처리할까?

오라클 옵티마이저는 통계 정보, 인덱스 유무, 조건의 선택도 등을 종합적으로 판단해 실행 계획을 수립합니다. 이 과정에서 조건의 순서가 힌트를 줄 수는 있지만, 옵티마이저는 일반적으로 가장 효율적인 조건부터 우선 적용하려 합니다.

즉, 작성 순서보다는 조건의 필터링 효과(선택도)가 중요합니다. 예를 들어 department_id = 10 조건이 훨씬 더 많은 행을 걸러낼 수 있다면, 옵티마이저는 해당 조건을 먼저 적용하는 방향으로 실행 계획을 구성합니다.

실무에서는 어떤 기준으로 정리할까?

  • 조건 순서는 성능에 직접적인 영향을 주지 않을 수 있음
    → 옵티마이저가 최적 조건을 자동으로 판단

  • 다만 인덱스를 활용하려면 조건 순서가 중요할 수 있음
    → 복합 인덱스의 컬럼 순서에 맞춰 WHERE 조건을 작성하는 것이 유리

  • 실행계획(EXPLAIN PLAN)으로 실제 적용된 조건 순서를 확인
    → 예상과 다른 경우 힌트나 인덱스 조정 필요

조건 순서가 항상 성능을 좌우하는 것은 아니지만, 인덱스 구조와 선택도에 맞춰 조건을 구성하면 더 효율적인 쿼리를 만들 수 있습니다.


#SQL #WHERE절 #조건순서 #실행계획 #성능최적화 #쿼리튜닝 #인덱스활용

반응형
LIST

INDEX RANGE SCAN과 FULL SCAN, 언제 어떤 게 빠를까?

Posted by heoncode
2025. 4. 9. 09:14 오라클 실무 쿼리 튜닝
반응형
SMALL

INDEX RANGE SCAN과 FULL SCAN, 언제 어떤 게 빠를까?

오라클의 실행계획에서 자주 등장하는 INDEX RANGE SCAN과 FULL TABLE SCAN은 단순히 “인덱스가 빠르다”는 기준으로 선택할 수 없습니다. 데이터 양, 인덱스 구조, 조건절 등에 따라 성능 차이는 극적으로 달라질 수 있으며, 실무에서는 오히려 FULL SCAN이 더 나은 선택일 때도 있습니다. 이번 글에서는 두 방식의 차이와 선택 기준을 살펴보겠습니다.

1. INDEX RANGE SCAN – 인덱스를 이용한 범위 검색

INDEX RANGE SCAN은 주어진 조건절에 따라 인덱스에서 일부 구간만을 읽어오는 방식입니다. 흔히 사용하는 비교 연산자(=, >, <, BETWEEN, LIKE 'abc%')가 있을 때 주로 사용되며, 조건이 인덱스 컬럼에 명확하게 매핑되어 있어야 효과적입니다.

SELECT * FROM employees WHERE department_id BETWEEN 10 AND 20;

이 경우 인덱스가 department_id에 존재하면 해당 범위만 스캔하게 되어 I/O 비용이 적고 빠른 성능을 기대할 수 있습니다.

2. FULL TABLE SCAN – 조건 무시, 테이블 전체 스캔

FULL SCAN은 인덱스를 무시하고 테이블 전체를 차례로 읽는 방식입니다. 일반적으로는 느릴 것이라 생각하지만, 다음과 같은 경우에는 오히려 효율적일 수 있습니다:

  • 조건절이 대부분의 데이터를 포함하는 경우 (예: 전체의 80% 이상)
  • 인덱스가 없는 경우
  • 병렬 처리를 통해 전체 스캔이 더 빠른 경우
  • 통계 정보나 옵티마이저 판단에 의해 인덱스 사용이 비효율적이라고 판단될 경우

예를 들어, 다음과 같은 쿼리는 조건절이 너무 광범위해 인덱스보다 FULL SCAN이 더 나을 수 있습니다.

SELECT * FROM orders WHERE order_date < SYSDATE;

3. 옵티마이저의 판단 기준

오라클 옵티마이저는 다음 요소를 기준으로 INDEX RANGE SCAN과 FULL SCAN 중 하나를 선택합니다.

  • 통계 정보: 테이블과 인덱스에 대한 최신 통계 정보
  • 데이터 분포도: 조건절이 얼마나 많은 행을 포함하는지
  • 인덱스 선택도: 인덱스가 얼마나 고유한 값들을 가지고 있는지
  • 병렬 처리 가능 여부

실제 실행계획에서 두 방식이 교체되는 경우는 의외로 많기 때문에, 반드시 EXPLAIN PLAN 또는 AUTOTRACE 등을 통해 실행계획을 확인하는 것이 중요합니다.

✅ 마무리

INDEX RANGE SCAN과 FULL TABLE SCAN은 단순히 "인덱스가 있으니까 인덱스 쓰자"는 기준으로 판단할 수 없습니다. 실무에서는 통계 정보, 데이터 양, 조건절, 병렬 처리 여부 등 다양한 요인을 종합적으로 고려해 어떤 방식이 더 빠를지 판단해야 하며, 이를 위해 실행계획 분석은 필수입니다.

#오라클 #SQL #실행계획 #성능 #인덱스 #실무팁 #쿼리튜닝

반응형
LIST

성능이 확 달라집니다: 오라클 SQL 힌트 실무 적용 가이드

Posted by heoncode
2025. 4. 7. 17:17 오라클 실무 쿼리 튜닝
반응형
SMALL

성능이 확 달라집니다: 오라클 SQL 힌트 실무 적용 가이드

오라클에서 SQL 성능을 조절하고 싶을 때 가장 직접적으로 개입할 수 있는 방법이 힌트(HINT) 입니다.
이번 글에서는 실무에서 자주 쓰는 힌트 종류와 사용법을 예제와 함께 정리해볼게요.


✅ 힌트란?

오라클 옵티마이저는 SQL을 자동으로 최적화하지만,
때로는 개발자가 직접 개입해서 더 나은 실행 계획을 유도할 수 있습니다.

이때 사용하는 것이 바로 힌트(HINT)입니다.
힌트는 주석처럼 보이지만 실제로는 옵티마이저에게 명령을 전달하는 강력한 도구입니다.


✅ 힌트 기본 문법

SELECT /*+ 힌트명 */ 컬럼명 FROM 테이블명;

예시:

SELECT /*+ INDEX(emp emp_name_idx) */ name  
FROM emp  
WHERE name = 'John';

✅ 실무에서 자주 쓰는 힌트 정리

  • FULL(table)
    → 테이블을 무조건 Full Scan 하도록 강제
    SELECT /*+ FULL(emp) */ * FROM emp

  • INDEX(table index_name)
    → 특정 인덱스를 사용하도록 강제
    SELECT /*+ INDEX(emp emp_name_idx) */ name FROM emp WHERE name = 'John'

  • NO_INDEX(table index_name)
    → 특정 인덱스를 사용하지 않도록 강제

  • USE_NL(table)
    → Nested Loop Join을 사용하도록 유도
    SELECT /*+ USE_NL(emp dept) */ ...

  • LEADING(table)
    → 조인 순서를 지정
    SELECT /*+ LEADING(emp dept) */ ...

  • PARALLEL(table, degree)
    → 병렬 처리 적용 (주의: 서버 자원 고려)


🧠 실무 팁

  • 힌트는 남용하면 역효과가 날 수 있습니다.
  • 옵티마이저가 힌트를 무시할 수도 있기 때문에, 실행 계획을 꼭 확인하세요.
  • 힌트는 임시 조치 또는 특정 상황에서 성능을 개선할 때 전략적으로 사용해야 합니다.

📌 마무리

힌트는 고성능 SQL을 작성할 수 있는 강력한 도구입니다.
하지만 제대로 이해하지 않고 사용할 경우 성능 저하를 부를 수도 있습니다.
항상 EXPLAIN PLAN 또는 AUTOTRACE 등을 통해 실행 계획을 확인하세요!

#오라클 #SQL힌트 #쿼리성능 #쿼리튜닝 #오라클실무
#FULLSCAN #INDEX힌트 #실행계획 #오라클튜닝 #개발자블로그 #티스토리블로그

오라클, SQL힌트, 오라클힌트, 쿼리성능, SQL튜닝, 쿼리튜닝, FULLSCAN, INDEX힌트, 실행계획, 오라클튜닝, 힌트적용, 옵티마이저, 오라클실무, 개발자블로그, 티스토리블로그

성능이 확 달라집니다: 오라클 SQL 힌트 실무 적용 가이드

오라클에서 SQL 성능을 조절하고 싶을 때 가장 직접적으로 개입할 수 있는 방법이 힌트(HINT) 입니다.
이번 글에서는 실무에서 자주 쓰는 힌트 종류와 사용법을 예제와 함께 정리해볼게요.


✅ 힌트란?

오라클 옵티마이저는 SQL을 자동으로 최적화하지만,
때로는 개발자가 직접 개입해서 더 나은 실행 계획을 유도할 수 있습니다.

이때 사용하는 것이 바로 힌트(HINT)입니다.
힌트는 주석처럼 보이지만 실제로는 옵티마이저에게 명령을 전달하는 강력한 도구입니다.


✅ 힌트 기본 문법

SELECT /*+ 힌트명 */ 컬럼명 FROM 테이블명;

예시:

SELECT /*+ INDEX(emp emp_name_idx) */ name  
FROM emp  
WHERE name = 'John';

✅ 실무에서 자주 쓰는 힌트 정리

  • FULL(table)
    → 테이블을 무조건 Full Scan 하도록 강제
    SELECT /*+ FULL(emp) */ * FROM emp

  • INDEX(table index_name)
    → 특정 인덱스를 사용하도록 강제
    SELECT /*+ INDEX(emp emp_name_idx) */ name FROM emp WHERE name = 'John'

  • NO_INDEX(table index_name)
    → 특정 인덱스를 사용하지 않도록 강제

  • USE_NL(table)
    → Nested Loop Join을 사용하도록 유도
    SELECT /*+ USE_NL(emp dept) */ ...

  • LEADING(table)
    → 조인 순서를 지정
    SELECT /*+ LEADING(emp dept) */ ...

  • PARALLEL(table, degree)
    → 병렬 처리 적용 (주의: 서버 자원 고려)


🧠 실무 팁

  • 힌트는 남용하면 역효과가 날 수 있습니다.
  • 옵티마이저가 힌트를 무시할 수도 있기 때문에, 실행 계획을 꼭 확인하세요.
  • 힌트는 임시 조치 또는 특정 상황에서 성능을 개선할 때 전략적으로 사용해야 합니다.

📌 마무리

힌트는 고성능 SQL을 작성할 수 있는 강력한 도구입니다.
하지만 제대로 이해하지 않고 사용할 경우 성능 저하를 부를 수도 있습니다.
항상 EXPLAIN PLAN 또는 AUTOTRACE 등을 통해 실행 계획을 확인하세요!

#오라클 #SQL힌트 #쿼리성능 #쿼리튜닝 #오라클실무
#FULLSCAN #INDEX힌트 #실행계획 #오라클튜닝 #개발자블로그 #티스토리블로그

반응형
LIST