select * from(
select 거래일시, 체결건수, 체결수량, 거래대금
from 종목거래
WHERE 종목코드 = 'KR'
AND 거래지점코드 IN ('A','B')
AND 거래일시 >= TRUNC(SYSDATE)
ORDER BY 거래일시 DESC, 거래순번 DESC
)
where rownum <= 50
이 경우
인덱스를
종목코드 + 거래지점코드 + 거래일시 + 거래순번
거래지점코드 +종목코드 + 거래일시 + 거래순번
는 소트생략 불가능하다고 나오는데 왜 그런건가요?
정렬 기준과 인덱스 순서가 다르죠
- 정렬키 순서 : (종목코드), 거래일시, 거래순번
- 인덱스 순서 : (종목코드), 거래지점코드, 거래일시, 거래순번
종목코드는 이퀄조건에 따라 유일한 값이라
정렬 기준에는 없지만 영향이 없다고 볼 수 있습니다.
거래지점코드는 IN 조건으로 유일 값이 아닙니다.
정렬 기준에 중간 값이 빠져 있으니 인덱스만으로는 정렬 생략이 불가합니다.
예를 들면
조건을 만족하는 자료가 다음과 같이 4건이 있다고 가정했을 때
1. 인덱스 순서는 다음과 같고
- KR A 20240118 1
- KR A 20240118 2
- KR B 20240118 1
- KR B 20240118 2
2. 정렬 순서는 다음과 같습니다.(편의상 ASC 로 가정)
- KR A 20240118 1
- KR B 20240118 1
- KR A 20240118 2
- KR B 20240118 2
1과 2의 순서가 다르기 때문에 정렬 생략 불가