Sort Aggregate는 전체 로우를 대상으로 집계를 수행할 때 나타나는데, 실제 소트가 발생하지는 않는다.
select sum(sal), max(sal), min(sal) from emp;
-> SORT AGGREGATE
0 sorts (memory)
0 sorts (disk)
데이터 정렬을 위해 order by 오퍼레이션을 수행할 때 나타난다.
select * from emp order by sal desc;
-> SORT ORDER BY
1 sorts (memory)
0 sorts (disk)
sorting 알고리즘을 사용해 그룹별 집계를 수행할 때 나타난다.
select deptno, job, sum(sal), max(sal), min(sal)
from emp
group by deptno, job
order by deptno, job ;
-> SORT GROUP BY
1 sorts (memory)
0 sorts (disk)
order by절을 함께 명시하지 않으면 대부분 hash group by 방식으로 처리된다.
select deptno, job, sum(sal), max(sal), min(sal)
from emp
group by deptno, job ;
-> HASH GROUP BY
0 sorts (memory)
0 sorts (disk)
hash group by는 정렬을 수행하지 않고 해싱 알고리즘을 사용해 데이터를 그룹핑한다.
읽는 로우마다 group by 컬럼의 해시 값으로 해시 버킷을 찾아 그룹별로 집계항목을 갱신하는 방식이다.
정렬된 group by 결과를 얻고자 한다면, 실행계획에 설령 'sort group by'라고 표시되더라도 반드시 order by를 명시해야 한다.
Unnesting된 서브쿼리가 M쪽 집합이거나 Unique 인덱스가 없다면, 그리고 세미 조인으로 수행되지도 않는다면 메인 쿼리와 조인되기 전에 sort unique 오퍼레이션이 먼저 수행된다.
소트 머지 조인을 수행할 때 나타난다.
select /*+ ordered use_merge(e) * / *
from dept d, emp e
where d.deptno = e.deptno ;
-> SORT JOIN
SORT JOIN
2 sorts (memory)
0 sorts (disk)
분석함수를 수행할 때 나타난다.
select empno, ename, job, mgr, sal
, avg(sal) over (partition by deptno)
from emp ;
-> WINDOW SORT
1 sorts (memory)
0 sorts (disk)