메뉴 건너뛰기

bysql.net

2. 소트를 발생시키는 오퍼레이션

2011.06.12 04:22

balto 조회 수:4847

 

(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)|

----------------------------------------------------------------

 

  • 오라클 고도화 원리와 해법 2 (bysql.net 2011년 1차 스터디)
  • 작성자: 박우창 (balto)
  • 최초작성일: 2011년 6월 15일
  • 본문서는 bysql.net 스터디 결과입니다 .본 문서를 인용하실때는 출처를 밝혀주세요. http://www.bysql.net
  • 문서의 잘못된 점이나 질문사항은 본 문서에 댓글로 남겨주세요. ^^

??

번호 제목 글쓴이 날짜 조회 수
35 1. 옵티마이저 file 휘휘 2011.04.18 6062
34 3. 옵티마이저의 한계 - P 휘휘 2011.04.18 3698
33 2. 옵티마이저 행동에 영향을 미치는 요소 balto 2011.04.18 6159
32 3. 옵티마이저의 한계 휘휘 2011.04.19 6698
31 4. 통계정보 Ⅰ file 토시리 2011.04.25 16008
30 6. 히스토그램 오예스 2011.04.25 17369
29 5. 카디널리티 오라클잭 2011.04.27 12915
28 7. 비용 file balto 2011.05.02 4992
27 8. 통계정보 Ⅱ AskZZang 2011.05.04 5913
26 1. 쿼리 변환이란? 운영자 2011.05.16 6258
25 3. 뷰 Merging 오라클잭 2011.05.17 6080
24 2. 서브쿼리 Unnesting 토시리 2011.05.18 2077
23 5. 조건절 이행 file balto 2011.05.30 5464
22 4. 조건절 Pushing 오예스 2011.05.31 17472
21 6. 조인 제거 AskZZang 2011.06.01 5440
20 7. OR-Expansion AskZZang 2011.06.01 8325
19 12. 기타 쿼리 변환 휘휘 2011.06.06 3122
18 10. 실체화 뷰 쿼리로 재작성 오라클잭 2011.06.08 9952
17 11. 집합 연산을 조인으로 변환 오라클잭 2011.06.08 4955
» 2. 소트를 발생시키는 오퍼레이션 file balto 2011.06.12 4847