SQL*Plus, 논리합 연산자의 액세스 효율화 – 중복된 IN 조건의 활용: 중복 상수 IN 조건의 실행계획
SELECT * FROM TAB1 WHERE 지역 = '서울' AND 구분 IN('3', '1') AND 발생일자 IN('19980610', '19980615');
– index가 지역 + 구분 + 발생일자일 경우 4개(2 x 2)로 분리된다.
– index가 지역 + 구분 + 발생일자 + 부서코드일 경우 2개(2)로 분리된다.
SELECT * FROM TAB1 WHERE 지역 IN('서울', '부산') AND 구분 IN('3', '1') AND 발생일자 IN('19980610', '19980615');
index가 지역 + 구분 + 발생일자일 경우 8개(2 x 2 x 2)로 분리된다.
index가 지역 + 구분 + 발생일자 + 부서코드일 경우 4개(2 x 2)로 분리된다.
- 규칙 1: 3개 컬럼 이하의 index는 상수(변수 포함) IN 조건은 정상적인 분리
- 규칙 2: 4개 컬럼 이상의 index의 중복 상수 IN 조건은 2컬럼까지 분리
SELECT * FROM TAB1 WHERE 지역 IN('서울', '부산') AND 구분 IN('3', '1') AND 발생일자 IN('19980610', '19980615') AND 부서코드 LIKE '211%';
– index가 지역 + 구분 + 발생일자 + 부서콛일 경우 연속선(=, Between, Like, <, >) 조건이 뒤에 오면 정상적으로 분리
- 규칙 3: 4개 컬럼 이상 index의 상수(변수 포함) IN 조건은 연속선에 해당하는 조건이 뒤에 오면 정상적으로 분리
- 규칙 4: 중복된 상수 IN 조건이 정상적으로 분리되지 않으면 ‘USE_CONCAT’ Hint로 정상적인 분리 가능(단, 함부로 사용하지 말 것).
SELECT * FROM TAB2 WHERE 제품 = 'KH2200' AND 부서 IN ( SELECT 부서 FROM DEPT WHERE 부서 LIKE '21%' ) AND 구분 BETWEEN '3' AND '5';
- 규칙 5: Subquery 뒤에 오는 IN 조건은 실행계획 분리에 기여하지 못한다.
SELECT * FROM TAB2 WHERE 제품 IN('KH220', 'MS3120') AND 부서 IN ( SELECT 부서 FROM DEPT WHERE 부서 LIKE '21%' ) AND 구분 BETWEEN '3' AND '5';
- 규칙 6: Subquery 앞에 위치한 IN 조건이 실행계획 분리에 참여하면 다음과 같이 중복 수행된다.
CONCATENATION NESTED LOOPS TABLE ACCESS(BY ROWID) OF 'DEPT' INDEX(RANGE SCAN) OF '부서_PK' TABLE ACCESS(BY ROWID) OF 'TAB2' INDEX(RANGE SCAN) OF 'INDEX1' NESTED LOOPS TABLE ACCESS(BY ROWID) OF 'DEPT' INDEX(RANGE SCAN) OF '부서_PK' TABLE ACCESS(BY ROWID) OF 'TAB2' INDEX(RANGE SCAN) OF 'INDEX1'
– 2번 수행 된다.
원문 출처
Encore – 대용량 데이터베이스