SQL 2015. 4. 28. 18:37

데이터 정렬 제거하기

링크 : 

  1. 1. 데이터 파일의 구조
  2. 2. DBMS 메모리 구조
  3. 3. 인덱스 기본
  4. 4. 정렬을 제거하는 방법
  5. 5. 프로시져 캐시 경합 확인하기
  6. 6. Loop 쿼리 제거하기
  7. 7. 튜닝 결과 샘플 보기


정렬이 비싼 이유

 정렬은 우선 데이터를 추출한 후에 특정 칼럼으로 다시 추출한다추출한 데이터에 다시 액세스하는 행위 자체가 이미 비용 낭비이다.

작업은 일반적으로 작업 쓰레드 메모리 영역을 사용하지만 대량의 데이터를 처리할 때는 디스크에서 정렬이 이루어진다. (일반적으로 물리적인 디스크 I/O는 비싸다)


정렬이 발생할 때

  • ORDER BY
  • DISTINCT
  • Sort Merge Join
  • Hash Join
  • 집합 연산자 (UNION ALL 제외)
  • 분석 함수
  • 그룹 함수 (DBMS 버전에 따라 발생하지 않을 수 있음)
  • IN 절의 사용 (수행 방식에 따라 다름)



집합 연산자가 정렬을 수행하는 이유

-       교집합의 모양을 확인하기 위해서는 반드시 정렬이 필요하기 때문이며 UNION ALL이 정렬을 하지 않은 이유는 중복을 허용하는 합집합이기 때문



GROUP BY

-       동일한 데이터를 하나의 값으로 추출하기 때문에 정렬이 필요하다.



SELECT 

           ROW_NUMBER() OVER( PARTITION BY [GroupCode] ORDER BY [StartDate] DESC )as row

FROM   ...

WHERE ...

분석함수

-       분석함수는 해당 함수 옆에 OVER 절을 설정한다. OVER 절은 데이터를 논리적으로 분할하는 PARTITION 절과 해당 논리적인 분할 영역을 정렬하는 ORDER BY 절로 구분한다.




정렬을 제거 할 수 있는 인덱스 구성 방법

점조건 + 점조건 + 정렬의 첫번째 조건 + ... + 정렬의 N번째 조건 + 선분 조건...