[ Oracle. 실행계획 - SORT ]
1. sort 종류
- 명시적 sort, 암시적 sort
2. Sort 수행위치에 따른 구분
1. Memory Sort
- Memory내에서 Sort작업이 전부 이루어 지는 경우
2. Disk Sort
- 메모리 부족시 Disk영역을 빌려 Sort가 수행되는 경우. 속도가 느림
2. 명시적 Sort 예제
. sql>SELECT deptno, ename, sal
FROM emp_large
ORDER BY deptno, sal desc;
. 실행계획
3. 암시적 Sort 예제
. distinct에 의한 암시적 Sort
- SELECT DISTINCT job FROM emp_large;
- 9i 실행계획
; 대상 데이터를 job 컬럼을 기준으로 정렬 연산 수행한 후
해당 데이터를 처음부터 마지막까지 읽어 내려 가면서 중복 걸랜 후
결과를 리턴하기 때문
- 10g 실행계획
; Distinct연산에 의한 Unique값을 찾기 위해 Hash연산을 사용
정렬된 결과를 나타내지는 않지만 Sort보다 가벼운 연산
- 9i 와 10g의 Distinct에 의한 Unique값을 찾는 비용은
약 : 70% : 3% 이다.
4. 암시적 - Sort Merge Join
- sql>SELECT /*+ USER_MERGE(emp_large, depart) */
dname, ename, job_sal
FROM emp_large a, depart
WHERE a.dept_no = b.dept_no * 1;
; depart.dept_no 컬럼의 인텍스를 사용하지 못하게 하여 Sort연산을 실행하도록 함
- 실행계획
;
5. SORT(AGGREGATE) ~ 그룹행 연산 (실제적으로 SORT가 발생하는 것 아님)
- sql > SELECT count(*) FROM emp_large WHERE ename like 'A%';
SELECT max(sql), min(sal) FROM emp_large;
SELECT avg(sal) FROM emp_large;
- 실행계획
; Count나 Sum, Avg와 같은 그룹행 연산에서 결과 집합을 집계(Aggreagte)연산을
수행했다는 의미
; 실제적인 Sort를 하지는 않음
; 비용이 발생하지 않은 Operation은 실제수행된것은 아니고 개념적인 수행임
-------------------------
** 집합연산
-------------------------
1. 집합연산 종류
1. UNION ALL
2. UNION (합집합)
3. INTERSECT (교집합)
4. MINUS (차집합)
- UNION, INTERSECT, MINUS는 두 집한간에 공통된 요소를 찾아야 함
2. UNION ALL
- sql > SELECT deptno FROM depart
UNION ALL
SELECT deptno FROM emp_large;
- 실행계획
; depart 테이블에서 index가 존재하는 deptno컬럼 1개만 필요하므로
INDEX FULL SCAN이 수행 됐음
즉, 인덱스내에 필요한 모든 컬럼이 있으므로 인덱스에만 접근.
3. UNION
- sql > SELECT deptno FROM depart
UNION
SELECT deptno FROM emp_large;
- 실행계획
; UNION에서 중복된 값을 걸러내기 위해 SORT연산을 수행
; TempSpcace : 10g부터 추가
SORT를 하기 위해 6280k의 공간이 필요하다는 의미
; 비용 (Cost) = CPU Cost + IO Cost
: 633 의 비용 시 CPU Cost비중 2%
(즉, Full Table Scan은 IO 집중(Intensive)적인 작업 이라는 의미)
; Memory Sort만 발생했음
. CPU Cost가 100%라는 의미는 I/O Cost가 발생하지 않았다는 의미임
; 위 sql문장 수행전에 sql>SET AUTOTRACE TRACEONLY 하에서 다시 실행해보면
4. INTERSECT
- sql > SELECT deptno FROM depart
INTERSECT
SELECT deptno FROM emp_large;
- 실행계획
; depart는 Index Full scan이므로 NOSORT를 하고
emp_large는 Table Access Full Scan이므로 Sort Unique Scan을 함
그런 후 INTERSECTION을 의미상으로 수행
(SORT UNIQUE : Unique값을 찾기 위해 Sort연산을 수행한다는 의미)
5. MINUS
- sql > SELECT deptno FROM depart
MINUS
SELECT deptno FROM emp_large;
- 실행계획
;