Tag Archives: SQL*Plus

SQL*Plus, 논리합 연산자의 액세스 효율화 – 중복된 IN 조건의 활용: 중복 상수 IN 조건의 실행계획

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 – 대용량 데이터베이스