5.1 소트 연산에 대한 이해

개발자 로그·2021년 7월 3일
0

친절한SQL튜닝

목록 보기
15/15
post-thumbnail

소트 수행 과정

  • 메모리 소트 (In-Memory Sort) : 전체 데이터의 정렬 작업을 메모리 내에서 완료하는것 (Internal Sort)

  • 디스크 소트 (To-Disk Sort) : 할당받은 Sort Area 내에서 정렬을 완료하지 못해 디스크 공간까지 사용하는 경우 (External Sort)

    < 디스크 소트 과정 >

    소트할 대상 집합을 SGA 버퍼캐시를 통해 읽어들이고, 일차적으로 Sort Area에서 정렬을 시도

    ⇒ 양이 많을 때는 정렬된 중앙집합을 Temp 테이블스페이스에 임시 세그먼트를 만들어 저장
    ( Sort Area가 찰 때마다 Temp 영역에 저장해 둔 중간 단계의 집합 → Sort Run )

    ⇒ 정렬된 최종결과 집합을 얻으려면 이를 다시 Merge ( Sort Area + Sort Run )

    ⇒ 오름차순 정렬이라면 각각에서 가장 작은 값부터 PGA로 읽어 들이다가 PGA가 찰 때마다 쿼리 수행 다음 단계로 전달하거나 클라이언트에 전송

소트 연산

  • 메모리 집약적(Memory-intensive)일 뿐만 아니아 CPU 집약적(CPU-intensive)이다.
  • 디스크 소트가 발생하는 순간 SQL 수행 성능은 나빠질 수밖에 없다.
    • 부분범위 처리를 불가능하게 함으로써 OLPT 환경에서 애플리케이션 성능을 저하시키는 주요인

소트 튜닝 방안

  • 데이터 모델 측면에서의 검토
  • 소트가 발생하지 않도록 SQL 작성
  • 인덱스를 이용한 소트 연산 대체
  • Sort Area를 적게 사용하도록 SQL 작성
  • Sort Area 크기 조정

소트 오퍼레이션

( 1 ) Sort Aggregate

  • 전체 로우 대상으로 집계를 수행할 때 나타남 - 실제로 데이터를 정렬하진 않음
select sum(sal), max(sal), min(sal), avg(sal) 
from emp;

( 2 ) Sort Order By

  • 데이터를 정렬할 때 사용
select * from emp order by sal desc;

( 3 ) Sort Group By

  • 소팅 알고리즘을 사용해 그룹별 집계를 수행할 때 나타남
  • disntinct count 를 만났을 땐 항상 sort goup by 방식을 수행한다.
select sum(sal), max(sal), min(sal), avg(sal) 
from emp
group by deptno 
order by deptno;

⭐ 정렬된 group by 결과를 얻고자 한다면, 실행계획에 설령 'sort group by'라고 표시되어 있더라도 반드시 order by를 명시해야 한다.

( 4 ) Sort Unique

  • Unnesting된 서브쿼리가 M쪽 집합이거나 Unique 인덱스가 없다면, 그리고 세미 조인으로 수행되지도 않는다면 메인 쿼리와 조인되기 전에 sort unique 오퍼레이션이 먼저 수행된다.
    ( 서브쿼리의 유일성이 보장된다면, Sort Unique 오퍼레이션은 생략된다. )
select /*+ ordered use_nl(dept) */ * 
from dept
where deptno in 
	(select /*+ unnest */ deptno
           from emp 
          where job = 'CLERK');
  • Union, Minus, Intersect 같은 집합(Set) 연산자, Distinct 연산자를 사용할 때도 Sort Unique 오퍼레이션이 나타남

( 5 ) Sort Join

  • 소트 머지 조인을 수행할 때 나타남

( 6 ) Window Sort

  • 윈도우 함수 ( =분석 함수 )을 수행할 때 나타남
profile
성장하는 개발자

0개의 댓글

관련 채용 정보