Pruning
사용자가 쿼리를 던지면, 옵티마이저는 해당 테이블이 파티셔닝되어 있는지 확인한다. 만약 조건절에 사용된 컬럼이 파티션 키(Partition Key)라면, 전체 데이터를 스캔(Full Table Scan)하는 대신 해당 조건에 맞는 파티션 세그먼트에만 접근한다.
- Full Scan: 모든 파티션을 다 뒤짐.
- Pruning 적용: 논리적으로 결과가 존재할 수 없는 파티션은 실행 계획에서 완전히 제외함.
| 유형 | 설명 |
|---|---|
| 정적 프루닝 (Static) | 쿼리 컴파일 시점에 접근할 파티션을 미리 결정하는 방식. (예: WHERE 날짜 = ‘20250101’) |
| 동적 프루닝 (Dynamic) | 쿼리 실행 시(Runtime)에 바인드 변수나 조인 조건 등에 의해 결정되는 방식. (예: WHERE 날짜 = :val 또는 서브쿼리 결과 이용) |
성능에 미치는 영향
- I/O 감소: 물리적으로 읽어야 할 데이터 블록 수가 줄어들어 응답 속도가 빨라진다.
- 리소스 절약: CPU 및 메모리 사용량을 줄여 시스템 전체의 처리량을 높인다.
- 인덱스 효율: 로컬 파티션 인덱스(Local Partitioned Index)와 결합하면 인덱스 스캔 범위까지 좁혀져 성능이 극대화된다.
프루닝이 작동하지 않는 경우
다음과 같은 상황에서는 옵티마이저가 프루닝을 수행하지 못하고 전체 파티션을 스캔
-
파티션 키 컬럼 가공:
WHERE TO_CHAR(PRT_DATE, 'YYYY') = '2025'와 같이 키 컬럼을 함수로 감싸거나 변형하면 프루닝이 불가능하다. -
데이터 타입 불일치: 파티션 키는 숫자형인데 조건절에 문자형을 넣는 등 묵시적 형변환이 발생할 때.
-
파티션 키가 아닌 컬럼으로만 조회:
WHERE절에 파티션 키 컬럼이 포함되지 않으면 전체 파티션을 다 뒤져야 한다.