오라클 성능 고도화 원리와 해법 II (2012년)
소트를 발생시키는 오퍼레이션 0 0 59,698

by 구루비스터디 소트튜닝 SORT AGGREGATE Sort Order By Sort Group By [2018.04.01]


소트 발생 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

  • 분석함수 사용 시 발생
"구루비 데이터베이스 스터디모임" 에서 2012년에 "오라클 성능 고도화 원리와 해법 II " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3298

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입