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)