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