by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

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




소트 발생 Operation

  • sort aggregate
  • sort order by
  • sort group by(hash group by)
  • sort unique(hash unique)
  • sort join
  • window sort

1. Sort aggregate

전체 Row 대상의 집계 쿼리
SQL> select sum(value) from table ;

2. Sort order by

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 으로 변환될 때

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 처리 함

5. Sort join

  • 소트 머지 조인 시
  • Outer table 의 인덱스를 사용하면 Sort가 발생하지 않음

6. Window sort

  • 분석함수 사용 시 발생

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.