불완전한 비용기반 옵티마이저인 FIRST_ROWS 모드 사용으로 인해 잘못된 실행계획이 수립되는 경우, 온전한 비용기반 옵티마이저 모드인 ALL_ROWS 또는 FIRST_ROWS_N 모드를 사용하여 개선한다.
개선 전
- (문제 상황) 점번호 컬럼 조건이 인덱스 access 조건이 되지 못하여 총계정기본 테이블 및 인덱스 액세스 량이 과다해 짐
- SQL문을 확인해 보면, 기준일자 컬럼 조건절 외에 점번호 컬럼 조건절도 인덱스 access 조건이 되어야 총계정기본 테이블 또는 인덱스 액세스 범위를 줄일 수 있는데, 실행계획이 그렇게 수립되지 못함
개선 방안
- (문제 원인) 기준일자와 점번호 컬럼이 선두인 인덱스가 있음에도 불구하고 점번호 결과집합을 만드는 IN 서브쿼리 부분이 먼저 실행되지 못한 것은 FIRST_ROWS 모드 특성 때문임. FIRST_ROWS 옵티마이저 모드는 ORDER BY 오퍼레이션을 회피할 수 있는 대안을 항상 (비용 산정 않고) 선택하는데, 여기서는 PK 인덱스를 범위 스캔하는 것이 그 대안이었음
- (개선 방안) FIRST_ROWS 옵티마이저 모드 대신 온전한 비용기반 옵티마이저인 ALL_ROWS 모드를 사용하도록 힌트 사용함
개선 후
- (개선 결과) IN서브쿼리 부분이 먼저 수행되었고, 총계정기본 데이터 액세스 량이 개선전 보다 현저히 감소함
- 조건절 정보(Predicates Information)을 통해, 기준일자 조건절과 점번호 조건절이 모두 인덱스 access 조건이 된 것을 확인할 수 있음
댓글
댓글 쓰기