인덱스 정보
일별지수업종별거래및시세_FK : 지수구분코드 + 지수업종코드 + 거래일자
일별지수업종별거래및시세_X01 : 거래일자
튜닝전 쿼리
SELECT 거래일자 , sum(decode(지수구분코드, '1', 지수종가, 0) kospi200_idx, , sum(decode(지수구분코드, '1', 누적거래량, 0) kospi200_idx_trdvol , sum(decode(지수구분코드, '2', 지수종가, 0) kosdaq_idx , sum(decode(지수구분코드, '2', 누적거래량, 0) kosdaq_idx_trdvol FROM 일별지수업종별거래및시세 a WHERE 거래일자 between :startDd and :endDd AND 지수구분코드 || 지수업종코드 in ('1001','2003') GROUP BY 거래일자; |
튜닝 포인트
지수구분코드 + 지수업종코드 + 거래일자 컬럼에 해당되는 인덱스가 있으나
지수구분코드||지수업종코드 이렇게 인덱스에 포함된 컬럼이 가공되어 있어
INDEX RANGE SCAN이 되지 못하고 있다.
INDEX RANGE SCAN이 될 수 있도록 인덱스에 포함된 컬럼을 가공하지 않도록 아래와 같이 조건을 변경한다.
변경 전
AND 지수구분코드 || 지수업종코드 in ('1001','2003')
변경 후
AND (지수구분코드, 지수업종코드) in (('1','001'),('2','003'))
튜닝 후 전체 쿼리
SELECT 거래일자 , sum(decode(지수구분코드, '1', 지수종가, 0) kospi200_idx, , sum(decode(지수구분코드, '1', 누적거래량, 0) kospi200_idx_trdvol , sum(decode(지수구분코드, '2', 지수종가, 0) kosdaq_idx , sum(decode(지수구분코드, '2', 누적거래량, 0) kosdaq_idx_trdvol FROM 일별지수업종별거래및시세 a WHERE 거래일자 between :startDd and :endDd AND (지수구분코드, 지수업종코드) in (('1','001'),('2','003')) GROUP BY 거래일자; |
출처 :
오라클 성능 고도화 원리와 해법Ⅱ p.31