2. 소트를 발생시키는 오퍼레이션
2011.06.12 04:22
(1) Sort Aggregate
- SORT AGGREGATE'는 전체 로우를 대상으로 집계를 수행할 때 나타나는데, 실제 SORT가 이루어지지는 않음
■ 실험
SELECT SUM(SAL), MAX(SAL), MIN(SAL) FROM EMP; |
---------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4 | 3 (0)| | 1 | SORT AGGREGATE | | 1 | 4 | | | 2 | TABLE ACCESS FULL| EMP | 12 | 48 | 3 (0)| ---------------------------------------------------------------- |
(2) Sort Order By
- 데이터 정렬을 위해 ORDER BY 오퍼레이션을 수행할 때 나타남.
■ 실험
SELECT * FROM EMP ORDER BY SAL DESC; |
---------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------- | 0 | SELECT STATEMENT | | 12 | 444 | 4 (25)| | 1 | SORT ORDER BY | | 12 | 444 | 4 (25)| | 2 | TABLE ACCESS FULL| EMP | 12 | 444 | 3 (0)| ---------------------------------------------------------------- |
(3) Sort Group By
- SORT GROUP BY는 소팅 알고리즘을 사용해 그룹별 집계를 수행할 때 나타남.
■ 실험
SELECT DEPTNO, JOB, SUM(SAL), MAX(SAL), MIN(SAL) FROM EMP GROUPBY DEPTNO, JOB ORDER BY DEPTNO, JOB; |
---------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------- | 0 | SELECT STATEMENT | | 11 | 165 | 4 (25)| | 1 | SORT GROUP BY | | 11 | 165 | 4 (25)| | 2 | TABLE ACCESS FULL| EMP | 12 | 180 | 3 (0)| ---------------------------------------------------------------- |
- 10gR2부터 HASH GROUP BY 방식이 도입되면서, ORDER BY절을 함께 명시하지 않으면 대부분 HASH GROUP BY 방식으로 되며 소트를 하지 않음.
- 일반적으로 잘 못 알려진 사실 중 하나는 GROUP BY를 사용할 경우 소트를 보장한다는 것인데, 이는 8i부터 이미 소트를 보장하지 않는다고 밝혀짐.
- 소팅 알고리즘을 사용해 SORT GROUP BY된 결과집합은 논리적인 정렬 순서를 따라 포인터로 서로 연결되있을 뿐, 물리적인 순서와 다를 수 있고, ORDER BY를 명시하지 않았을 때는 논리적 순서를 무시하고 물리적 순서에 따라 결과를 출력하므로, 정렬을 보장하지 않음. 즉, 실행계획에서 'SORT GROUP BY'의 의미는 '소팅 알고리즘을 사용해 값을 집계한다'는 뜻일 분 결과의 정렬을 의미하지 않음. 그러므로 GROUP BY 사용 시 정렬이 필요할 경우 반드시 ORDER BY를 추가해야 함.
- distinct 문이 있을 경우 ORDER BY가 없어도 SORT GROUP BY를 사용한다.
SELECT DEPTNO, JOB, count(distinct name)
FROM EMP
GROUPBY DEPTNO, JOB;
(4) Sort Unique
- 서브쿼리가 M쪽 집합이거나 Unique 인덱스가 없을 때 UNNESTING 되어 조인으로 풀릴 경우, 그리고 세미 조인이 아닐 경우 SORT UNIQUE 오퍼레이션 수행
- 만약 서브쿼리의 컬럼이 PK 또는 Unique인 경우 SORT UNIQUE 오퍼레이션은 생략
■ 실험
SELECT /*+ ORDERED USE_NL(DEPT) */ * FROM DEPT WHERE DEPTNO IN (SELECT /*+ UNNEST */ DEPTNO FROM EMP WHERE JOB = 'CLERK'); |
----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 62 | 5 (20)| | 1 | NESTED LOOPS | | 2 | 62 | 5 (20)| | 2 | SORT UNIQUE | | 2 | 22 | 3 (0)| |* 3 | TABLE ACCESS FULL | EMP | 2 | 22 | 3 (0)| | 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| |* 5 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| ----------------------------------------------------------------------------- |
- UNION, MINUS, INTERSECT, DISTINCT 구문도 마찬가지로 SORT UNIQUE 오퍼레이션이 나타남
■ 실험- UNION
SELECT JOB, MGR FROM EMP WHERE DEPTNO = 10 UNION SELECT JOB, MGR FROM EMP WHERE DEPTNO = 20; |
----------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------- | 0 | SELECT STATEMENT | | 6 | 90 | 8 (63)| | 1 | SORT UNIQUE | | 6 | 90 | 8 (63)| | 2 | UNION-ALL | | | | | |* 3 | TABLE ACCESS FULL| EMP | 3 | 45 | 3 (0)| |* 4 | TABLE ACCESS FULL| EMP | 3 | 45 | 3 (0)| ----------------------------------------------------------------- |
■ 실험- MINUS
SELECT JOB, MGR FROM EMP WHERE DEPTNO = 10 MINUS SELECT JOB, MGR FROM EMP WHERE DEPTNO = 20; |
----------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 90 | 8 (63)| | 1 | MINUS | | | | | | 2 | SORT UNIQUE | | 3 | 45 | 4 (25)| |* 3 | TABLE ACCESS FULL| EMP | 3 | 45 | 3 (0)| | 4 | SORT UNIQUE | | 3 | 45 | 4 (25)| |* 5 | TABLE ACCESS FULL| EMP | 3 | 45 | 3 (0)| ----------------------------------------------------------------- |
■ 실험- DISTINCT
SELECT DISTINCT DEPTNO FROM EMP ORDER BY DEPTNO; |
---------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 9 | 5 (40)| | 1 | SORT UNIQUE | | 3 | 9 | 4 (25)| | 2 | TABLE ACCESS FULL| EMP | 12 | 36 | 3 (0)| ---------------------------------------------------------------- |
(5) Sort Join
- SORT JOIN 오퍼레이션은 소트 머지 조인을 수행할 때 나타남
■ 실험
SELECT /*+ ORDERED USE_MERGE(E) */ * FROM DEPT D, EMP E WHERE D.DEPTNO = E.DEPTNO; |
----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 12 | 684 | 6 (17)| | 1 | MERGE JOIN | | 12 | 684 | 6 (17)| | 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| | 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| |* 4 | SORT JOIN | | 12 | 444 | 4 (25)| | 5 | TABLE ACCESS FULL | EMP | 12 | 444 | 3 (0)| ----------------------------------------------------------------------------- |
(6) Window Sort
- WINDOW SORT는 분석함수를 수행할 때 나타남
■ 실험
SELECT EMPNO, ENAME, JOB, MGR, SAL, AVG(SAL) OVER(PARTITION BY DEPTNO) FROM EMP; |
---------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------- | 0 | SELECT STATEMENT | | 12 | 348 | 4 (25)| | 1 | WINDOW SORT | | 12 | 348 | 4 (25)| | 2 | TABLE ACCESS FULL| EMP | 12 | 348 | 3 (0)| ---------------------------------------------------------------- |
??
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
55 | 4장._쿼리_변환 | 휘휘 | 2011.09.07 | 2394 |
54 | 진행기록 | 운영자 | 2011.08.23 | 2383 |
53 | 2. 병렬 Order By와 Group By | 휘휘 | 2011.06.30 | 10122 |
52 | 3. 병렬 조인 | 오예스 | 2011.06.29 | 4969 |
51 | 4. PQ_DISTRIBUTE 힌트 | 휘휘 | 2011.06.27 | 15614 |
50 | 5. 병렬 처리에 관한 기타 상식 [1] | balto | 2011.06.26 | 28162 |
49 | 1. 테이블 파티셔닝 | 오라클잭 | 2011.06.21 | 28273 |
48 | 2. 파티션 Pruning | 휘휘 | 2011.06.19 | 11862 |
47 | 7. Sort Area 크기 조정 | 오예스 | 2011.06.16 | 5986 |
46 | 5. 인덱스를 이용한 소트 연산 대체 | AskZZang | 2011.06.16 | 4955 |
45 | 4. 소트가 발생하지 않도록 SQL 작성 | AskZZang | 2011.06.16 | 3109 |
44 | 3. 데이터 모델 측면에서의 검토 | AskZZang | 2011.06.16 | 2724 |
43 | 5장. 소트 튜닝 | balto | 2011.06.16 | 4283 |
42 | 6. Sort Area를 적게 사용하도록 SQL 작성 | 오예스 | 2011.06.14 | 4209 |
41 | 1. 소트 수행 원리 | balto | 2011.06.12 | 8023 |
» | 2. 소트를 발생시키는 오퍼레이션 | balto | 2011.06.12 | 4847 |
39 | 11. 집합 연산을 조인으로 변환 | 오라클잭 | 2011.06.08 | 4956 |
38 | 10. 실체화 뷰 쿼리로 재작성 | 오라클잭 | 2011.06.08 | 9953 |
37 | 12. 기타 쿼리 변환 | 휘휘 | 2011.06.06 | 3122 |
36 | 7. OR-Expansion | AskZZang | 2011.06.01 | 8333 |