본문 바로가기

카테고리 없음

Note 003 # 인덱스 정렬생략


 Note 003_01

    # 인덱스 스캔으로 정렬연산을 생략할 수 있다

인덱스는 이미 정렬된 구조이기 때문에

이를 사용하면 실행계획에서 다음 계획을 생략할 수 있다.

  • SORT ORDER BY

  • SORT GROUP BY

위의 연산을 인덱스로 생략하면

실행계획에서 다음과 같이 표기된다.

  • ORDER BY는 인덱스 스캔으로 대체

  • GROUP BY는 SORT GROUP BY NO SORT


 Note 003_02

    # 정렬연산을 생략하려면

  • ORDER BY 절에 인덱스 구조 순서와 똑같이 기술.

  • 다만, = 조건으로 조회한 컬럼은 ORDER BY 절에서 생략 가능.

  • 다만, 사용되지않은 후행 컬럼은 ORDER BY 절에서 생략 가능.

  • Not-Nullable 인덱스여야 함.


 Note 003_03

    # 정렬연산 생략이 불가능한 경우

  • 옵티마이저가 인덱스 사용이 불리하다고 생각한 경우

  • 중간 컬럼이 누락된 경우

  • Nullable 인덱스인 경우.

  • Not-Nullable 이지만 NULL FIRST 조건을 추가한 경우.


 Plus Note 003_01

    # 인덱스 스캔으로 정렬연산을 생략할 수 있다

다음 쿼리에서 ORDER BY는 인덱스 RANGE 스캔으로,

GROUP BY는 NO SORT로 처리된 것에 주목하기 바란다.


-- 인덱스 X_LINEITEM_02 : [L_PARTKEY + L_SUPPKEY]
SELECT L_PARTKEY, L_SUPPKEY
FROM   LINEITEM
WHERE  L_PARTKEY < 10
AND    L_SUPPKEY < 10
GROUP BY L_PARTKEY, L_SUPPKEY
ORDER BY L_PARTKEY, L_SUPPKEY;


-------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 9 | 3 (0)| 00:00:01 | | 1 | SORT GROUP BY NOSORT| | 1 | 9 | 3 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | X_LINEITEM_02 | 1 | 9 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("L_PARTKEY"<10 AND "L_SUPPKEY"<10) filter("L_SUPPKEY"<10)