메뉴 건너뛰기

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 6. 조인 제거 AskZZang 2011.06.01 5441
34 4. 조건절 Pushing 오예스 2011.05.31 17482
33 5. 조건절 이행 file balto 2011.05.30 5465
32 2. 서브쿼리 Unnesting 토시리 2011.05.18 2079
31 3. 뷰 Merging 오라클잭 2011.05.17 6082
30 1. 쿼리 변환이란? 운영자 2011.05.16 6258
29 8. 통계정보 Ⅱ AskZZang 2011.05.04 5913
28 7. 비용 file balto 2011.05.02 4997
27 5. 카디널리티 오라클잭 2011.04.27 12919
26 6. 히스토그램 오예스 2011.04.25 17389
25 4. 통계정보 Ⅰ file 토시리 2011.04.25 16013
24 3. 옵티마이저의 한계 휘휘 2011.04.19 6698
23 2. 옵티마이저 행동에 영향을 미치는 요소 balto 2011.04.18 6161
22 3. 옵티마이저의 한계 - P 휘휘 2011.04.18 3699
21 1. 옵티마이저 file 휘휘 2011.04.18 6064
20 8. 고급 조인 테크닉-1 file 휘휘 2011.04.05 6461
19 8. 고급 조인 테크닉-2 오라클잭 2011.04.05 12561
18 7. 조인을 내포한 DML 튜닝 오예스 2011.04.04 9946
17 4. 조인 순서의 중요성 AskZZang 2011.03.30 5328
16 1. 인덱스 구조 file 운영자 2011.03.30 15951