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