선택적인 조건절을 사용하는 대신, AP로직을 통해 SQL문 조건절을 동적으로 구성(흔히 Dynamic SQL 이라고 함)하여 옵티마이저가 최적 실행계획을 수립하기 용이하도록 할 수 있다.
개선 전
- (문제 상황) 문서관리기본 및 신분증기본의 테이블/인덱스 블록을 많이 액세스함
- (문제 원인) 문서관리기본 및 신분증기본 테이블 모두 (액세스 범위를 크게 줄일 수 있는) 계좌번호 컬럼 선두인 인덱스가 있으나, 쿼리문에 사용한 INDEX 힌트와 OR 구문으로 인해 그 인덱스를 사용하지 못함
개선 방안
- (개선 방안) 조건절이 AP를 통해‘dynamic’하게 추가되므로 특정 인덱스를 고정적으로 사용하는 대신, 만들어진 조건절에 따라 옵티마이저가 최선의 인덱스를 선택할 수 있도록 현 index 힌트를 삭제함
- (개선 방안) 실명번호 값 입력시 "A.실명번호 = :변수" 조건절을 추가하듯, 계좌번호 값 입력 시 "A.계좌번호 = :변수" 조건절 추가하도록 AP 로직을 수정하고, 대신 현재 고정적으로 사용되고 있는 OR 조건절은 쿼리문에서 삭제함
개선 후
- (개선 결과) X11 및 X03 인덱스가 사용되고, 계좌번호 조건절이 access 조건이 되면서 액세스 량이 현저히 감소함
- 위 결과는 SQL문에 OR 구문으로 작성된 ‘복잡한’ 계좌번호 조건절 대신 ‚계좌번호 = :변수‛와 같이 심플한 조건절을 사용할 때, 수립되는 실행계획과 트레이스 결과임
- 참고로, 운영DB에서는 실명번호 조건절이 있는 것과 없는 것 2개 SQL문이 실행되고 있으며, 현 index 힌트를 제거하더라도 실명번호 조건절이 있는 경우에는 개선 전과 같이 X07과 X01 인덱스 사용하는 것을 확인함
댓글
댓글 쓰기