목적: 소트가 발생하지 않도록 SQL 작성
1. Union을 Union All로 대체
- Union을 사용하면 옵티마이저는 상단과 하단의 두 집합 간 중복을 제거하려고 sort unique 연산을 수행한다.
- Union All은 중복을 허용하며 두 집합을 단순히 결합하므로 소트 연산이 불필요하다.
1차 단계
SQL> SELECT EMPNO, JOB, MGR FROM EMP WHERE DEPTNO = 10
UNION
SELECT EMPNO, JOB, MGR FROM EMP WHERE DEPTNO = 20
;
2차 단계 - 두 집합간에 중복 가능성이 전혀 없어야 한다.
- SELECT LIST에서 EMPNO가 없다면 10번과 20번 부서에 JOB과 MGR이 같은 사원이 있을 수 있으므로
함부로 UNION ALL로 바꿔서는 안된다.
SQL> SELECT EMPNO, JOB, MGR FROM EMP WHERE DEPTNO = 10
UNION ALL
SELECT EMPNO, JOB, MGR FROM EMP WHERE DEPTNO = 20
;
2. Distinct를 Exists 서브쿼리로 대체
- 중복 레코드를 제거하려고 DISTINCT를 사용하는 경우가 있다. 대부분 EXISTS 서브쿼리로 대체함으로써 소트연산을 제거할 수 있다.
- EXISTS 서브쿼리의 가장 큰 특징은, 메인 쿼리로부터 건건이 입력 받은 값에 대한 조건을 만족하는 첫 번째 레코드를 만나는 순간 TRUE를 반환하고 서브쿼리 수행을 마친다.
1차 단계
SQL> SELECT DISTINCT 과금연월
FROM 과금
WHERE 과금연월 <= :yyyymm
AND 지역 LIKE :reg || '%'
;
2차 단계
SQL> SELECT 연월
FROM 연월테이블 A
WHERE 연월 <= :yyyymm
AND EXISTS (
SELECT 'X'
FROM 과금
WHERE 과금연월 : A.연월
AND 지역 LIKE :reg || '%'
)
;
'개발 및 관리 > Oracle 9i, 10g, 11g, 12c, 19c' 카테고리의 다른 글
소트 영역 크기 조정(고급 SQL 튜닝) - SQL전문가 가이드 p.706~p.707 (0) | 2012.10.26 |
---|---|
소트 영역을 적게 사용하도록 SQL 작성 - SQL전문가 가이드 p.695~p.706 (0) | 2012.10.26 |
소트 튜닝 - SQL전문가 가이드 p.689~p.693 (0) | 2012.10.26 |
Analytic Fuction(윈도우 함수) 활용(고급 SQL 활용) - SQL전문가 가이드 p.685~p.686 (0) | 2012.10.26 |
페이징 처리(고급 SQL 활용) - SQL전문가 가이드 p.683~p.684 (0) | 2012.10.26 |