통계 정보와 힌트 활용
옵티마이저가 의존하는 통계 정보와 실행 계획에 영향을 주는 힌트를 언제 믿고 언제 조심해야 하는지 정리합니다.
출제 빈도 ★★★☆☆ 관련 문제 3개 |
통계힌트 옵티마이저의 판단 재료
비용 기반 옵티마이저는 실제 데이터를 전부 실행해본 뒤 계획을 고르는 것이 아닙니다. 테이블과 인덱스의 통계 정보를 바탕으로 예상 비용을 계산합니다.
통계가 정확하면 좋은 계획을 고를 가능성이 높아지고, 통계가 틀리면 SQL 문장이 맞아도 실행 계획이 나빠질 수 있습니다.
주요 통계 정보
| 통계 | 의미 | 실행 계획 영향 |
|---|---|---|
| 테이블 행 수 | 전체 데이터 규모 | 전체 스캔 비용 추정 |
| 블록 수 | 읽어야 할 저장 단위 규모 | I/O 비용 추정 |
| 컬럼 값 종류 수 | 중복 정도 | 선택도 계산 |
| NULL 개수 | 조건 제외 가능성 | 카디널리티 추정 |
| 히스토그램 | 값 분포의 치우침 | 특정 조건 값의 결과 건수 추정 |
| 인덱스 높이 | 인덱스 탐색 단계 | 인덱스 접근 비용 추정 |
특히 값 분포가 치우친 컬럼은 평균만으로 판단하면 주의가 필요합니다. 예를 들어 주문 상태가 대부분 완료이고 일부만 취소라면 두 값의 선택도는 크게 다릅니다.
카디널리티 오류
카디널리티는 조건 적용 후 예상 행 수입니다. 옵티마이저가 10행으로 예상했는데 실제로 100만 행이 나오면 잘못된 조인 방식이나 인덱스 접근을 선택할 수 있습니다.
WHERE order_status = 'CANCELLED'
취소 주문이 아주 적다면 인덱스 접근이 유리할 수 있습니다. 하지만 통계가 이를 반영하지 못하면 옵티마이저가 전체 스캔이나 부적절한 조인 순서를 고를 수 있습니다.
힌트의 역할
힌트는 옵티마이저에게 특정 방향을 제안하는 방법입니다.
SELECT /*+ INDEX(o idx_orders_date) */ *
FROM orders o
WHERE o.order_date >= DATE '2026-01-01';
힌트는 실행 계획을 안정화하거나 옵티마이저가 놓친 경로를 유도할 때 도움이 됩니다. 하지만 데이터가 바뀌어도 힌트는 그대로 남기 때문에 장기적으로는 영향이 클 수 있습니다.
자주 보는 힌트 감각
| 힌트 | 의도 |
|---|---|
INDEX | 특정 인덱스 사용 유도 |
FULL | 전체 테이블 스캔 유도 |
USE_NL | Nested Loop 조인 유도 |
USE_HASH | Hash 조인 유도 |
LEADING | 조인 시작 순서 유도 |
힌트는 문법이 맞아도 상황에 따라 무시되거나 기대와 다르게 작동할 수 있습니다. 객체 별칭을 정확히 맞추는 것도 중요합니다.
올바른 튜닝 순서
- 실제 실행 계획과 실행 통계를 확인합니다.
- 예상 행 수와 실제 행 수 차이를 봅니다.
- 통계 정보가 최신이고 분포를 반영하는지 확인합니다.
- SQL 조건식과 인덱스 구조를 조정합니다.
- 그래도 필요할 때 제한적으로 힌트를 사용합니다.
한 문장 요약
통계는 옵티마이저의 눈이고, 힌트는 방향 지시지만 둘 다 실제 데이터 변화 앞에서는 검증이 필요합니다.