소트 발생 Operation
- sort aggregate
- sort order by
- sort group by(hash group by)
- sort unique(hash unique)
- sort join
- window sort
1. Sort aggregate
SQL> select sum(value) from table ;
2. Sort order by
SQL> select name from table order by name ;
3. Sort group by(hash group by)
SQL> select name, sum(value) from table group by name;
- 10gr2 부터 그룹 바이 후 Order by 명시 안하면 hashing 알고리즘 이용해 집계
SQL> select name, sum(value) from table group by name order by name; => *sort group by*
SQL> select name, sum(value) from table group by name ; => *hash group by*
- 아래와 같은 쿼리는 Order by 없어도 sort group by 로 풀린다고 함
SQL> select c1, c2, count(distinct c3) from table croup by c1, c2 ;
- c2, c3 별로 정렬 후 c1-c2 별 c3 의 유니크한 갯수를 세어야 하는데 c3 가 다르면 서로 다른 해시 머킷에 들어가므로
- 유니크한 값의 갯수를 셀 수 없다고 함.
- 근데 584p 에는 group by 컬럼으로 해시 버킷에 넣는다고 했는데 c3 는 상관 없는거 아닌지...
- 집계 시 하나의 그룹에 속하는 전체 Row 를 읽고 계산하는게 아니라 건건이 읽어가면서 갱신함
- => Row 가 많아도 그룹 갯수 적으면 Disk Sort 발생하지 않음
4. Sort unique(hash unique)
집합 연산 시 발생
- Union, Intersect, minus
- _convert_set_to_join = true 시 hash unique 연산 사용 - 조인으로 두 집합 연결하고 나서 중복 제거(4장 11절 참조)
Distinct 사용 시 발생
- 10gr2 부턴 order by 없을 시 hash unique 로 수행 됨
Subquery unnesting 시 조인 컬럼 데이터 정제를 위해 발생(4장 2절, 473p)
- DEPT, EMP Table 이 DEPT(DEPTNO):EMP(DEPTNO) = 1:M 관계일 때,
- Unnesting 되어서 Where 절 Subquery 가 Join 으로 변환될 때
SQL> select * from dept where deptno in (select deptno from emp);
- M:1 의 1쪽 테이블이라도 유니크 인덱스가 없으면(서브쿼리 컬럼이 유니크함을 물리적으로 보장받지 못하면)
SQL> select * from emp where deptno in (select deptno from dept);
- 서브쿼리 안의 deptno 를 unique 하게 만들어 만든 후 Unnesting 후 Join 처리 함
5. Sort join
- 소트 머지 조인 시
- Outer table 의 인덱스를 사용하면 Sort가 발생하지 않음
6. Window sort