Tag Archives: SQL*Plus

SQL*Plus, Inline view의 활용 – 기타 특이한 형태의 활용사례: 실행계획의 분리

SQL*Plus, Inline view의 활용 – 기타 특이한 형태의 활용사례: 실행계획의 분리

계약번호와 관리부서 중에서 최소 한가지는 반드시 입력된다.

SELECT
	계약번호
	, 관리부서명
	, 계약일
	, 구분
	, 고객주소
FROM 계약 x, 부서 y
WHERE y.부서코드 = x.관리부서
AND 계약번호 LIKE :계약번호 || '%'
AND 관리부서 LIKE :관리부서 || '%'
AND 계약일 LIKE :기준일 || '%'
AND NVL(구분, 'X') = NVL(:구분, 'X');

계약번호와 관리부서의 실행계획이 섞이게 된다.

SELECT
	계약번호
	, 관리부서명
	, 계약일
	, 구분
	, 고객주소
FROM
(
	SELECT
		*
	FROM 계약
	WHERE :계약번호 IS NOT NULL /* 계약번호가 들어올 때 */
	AND 계약번호 = :계약번호
	AND 관리부서 LIKE :관리부서 || '%'
	AND 계약일 LIKE :기준일 || '%'
	AND NVL(구분, 'X') = NVL(:구분, 'X')

	UNION ALL

	SELECT
		*
	FROM 계약
	WHERE 계약번호 IS NULL /* 관리부서가 들어올 때 */
	AND 관리부서 = :관리부서
	AND 계약일 LIKE :기준일 || '%'
	AND NVL(구분, 'X') = NVL(:구분, 'X')
	AND ROWNUM <= 300
) x, 부서 y
WHERE y.부서코드 = x.부서코드;

계약번호와 관리부서의 실행계획이 분리된다. Index 설정에 따라 실행계획을 분리한다.

  • UNION: SORT를 발생시킨다. 전체범위처리.
  • UNION ALL: SORT를 발생시키지 않는다. 부분범위처리.

원문 출처
Encore – 대용량 데이터베이스