옵티마이저는 Query Transformation 기능 중 하나인 OR EXPANSION(실행계획 분리)을 통해 선택적인 조건절을 최적화할 수 있는데, 그런 기능이 적용된 실행계획이 오히려 성능에 불리한 경우, NO_EXPAND, INDEX 힌트 등을 통해 OR EXPANSION 기능이 작동하지 않도록 한다.
개선 전
- (문제 상황) 고객번호 조건으로도 액세스해야 할 데이터 건수가 충분히 줄어들지 않았고, 전문발송내역 테이블과 조인하면서 결과 건수가 급감함
- (문제 원인) :고객번호 값이 입력되면 외환기본 테이블이 먼저 액세스되고, :고객번호가 입력되지 않으면 전문발송내역 테이블이 먼저 액세스되도록 실행계획이 분리되었는데(오라클 옵티마이저의 OR EXPANSION 기능), :고객번호가 입력되더라도 전문발송내역이 먼저 액세스 되는 것이 성능에 유리함을 확인함
개선 후
- (개선 방안) :고객번호 값 입력되더라도 전문발송내역 테이블이 먼저 액세스되도록(OR EXPANSION 되지 않도록) NO_EXPAND 힌트를 추가함 (LEADING 힌트로도 가능)
- (개선 결과) CONCATENATION 오퍼레이션이 사라지고, :고객번호 값 입력 여부 상관없이 전문발송내역 테이블을 먼저 액세스하는 실행계획이 수립되었으며, 개선 전보다 액세스 량이 크게 감소함
댓글
댓글 쓰기