h1.소트 발생 Operation
- sort aggregate
- sort order by
- sort group by(hash group by)
- sort unique(hash unique)
- sort join
- window sort
h2.1. Sort aggregate
전체 Row 대상의 집계 쿼리
SQL> select sum(value) from table ;
h2.2. Sort order by
Order by 쿼리 시 발생
SQL> select name from table order by name ;
h2.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 발생하지 않음
h2.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 으로 변환될 때
M:1 의 M 쪽 테이블 이거나
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 처리 함
h2.5. Sort join
- Outer table 의 인덱스를 사용하면 Sort가 발생하지 않음
h2.6. Window sort