불완전한 비용기반 옵티마이저인 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 조건이 된 것을 확인할 수 있음
컬럼의 부분값 검색을 위해 SUBSTR 함수 같은 예외적인 로직을 사용함으로써 인덱스를 사용하지 못하고, 최적 실행계획이 수립되지 않는 경우, 그런 예외 로직을 개선한다. 개선 전 (문제 상황) 관리내역 데이터를 과다하게 액세스함 (문제 원인) 암호화고객실명번호, 접촉전화번호 컬럼 조건절이 액세스 범위를 크게 줄일 수 있으나, 그 컬럼이 선두인 인덱스가 없고, 만약 있더라도 조건절의 ‘예외처리’로직으로 인해 그런 인덱스를 사용할 수 없는 상태임 참고로, 예외로직은 암호화고객실명번호 값이 NULL이면 암호화고객실명번호 컬럼 대신 고객실명번호 컬럼을 사용하라는 로직이며, NVL, DEDODE, OR 구문을 사용하면 적절한 인덱스가 있더라도 옵티마이저가 최적 실행계획을 수립하기 어려움 개선 방안 (개선 방안) 암호화고객실명번호, 접촉전화번호 각각 선두인 인덱스 2개를 생성함 (개선 방안) 인덱스 사용을 어렵게 하는 예외로직을 수정함 테이블 데이터를 조사해 보면 암호화고객실명번호 값이 NULL이면서 고객실명번호 값이 NULL이 아닌 것은 전체 15백만 건 중 1600여건(약 0.1%)으로 확인되며, 게다가 그 값은 암호화 불가한 비정상적인 값이고 조회할 가능성이 없는 값이어서 결국 예외로직이 무의미한 것으로 판단함 (따라서, 데이터 정제 대상임) 개선 후 (개선 결과) 암호화고객실명번호 컬럼 조건절 및 접촉전화번호 컬럼 조건절이 인덱스 access 조건이 되면서 액세스량이 개선 전에 비해 현저히 감소함