반응형
인덱스가 Id, ch_date, ch_order 순으로 생성되어 있을 경우 MIN 값을 구해도 별도의 정렬연산을 수행하지 않는다. 수직적 탐색을 통해서 가장 왼쪽지점에서 보는 최소 값이 바로 구하고자 하는 값이기 때문이다.
1 | SELECT MIN(ch_date) FROM scott.SORT_TEST WHERE ID = ‘C’; | cs |
MAX의 경우도 마찬가지이다. MIN과 다른 점은 왼쪽에서 찾는게 아니라 가장 오른쪽에 있는 데이터를 찾는다는 점이다.
1 | SELECT MAX(ch_date) FROM scott.SORT_TEST WHERE ID = ‘C’; | cs |
그래서 두 개의 실행계획을 살펴보면 인덱스 리프 블록의 왼쪽(MIN) 또는 오른쪽 (MAX)에서 레코드 하나(FIRST ROW)만 읽고 멈춘다.
1 | SELECT MAX(TO_DATE(ch_date)) FROM scott.SORT_TEST WHERE ID = 'C'; | cs |
이 경우에는 MAX일지라도 ch_date가 내부적으로 변경을 한 뒤에 최대값을 찾기 때문에 정렬을 한뒤에 진행이 가능하다.
하지만 이걸 반대로 바꿔서 진행하면 최대 값을 찾고 그 값을 TO_DATE()로 변경하기 때문에 큰 문제 없이 FIRST 항목만 찾게된다.
출처 : 친절한 SQL 튜닝
반응형
'데이터베이스 > 친절한 SQL 튜닝' 카테고리의 다른 글
인덱스를 이용한 sort 연산 생략 (0) | 2018.08.01 |
---|---|
인덱스 Range Scan이 되기 위한 선행 조건 (2) | 2018.07.06 |
인덱스 기본 사용법과 인덱스 스캔이 불가능한 경우 소 (0) | 2018.07.04 |
인덱스 구조 및 탐색 (0) | 2018.07.04 |
오라클 SGA 캐시 탐색 메커니즘 정리 (0) | 2018.06.29 |