일단 제가 다른 사이트에 올렸던 테스트 결과를 여기도 그대로 올리겠습니다.
10gR2에서 현재 저희 실무 쿼리일부와 실행계획을 올립니다...제가 다른 버전은 테스트를 못 하는 환경이라서리...^^;
아래에서 order by desc로 쿼리를 만들었는데 실행계획엔 INDEX RANGE SCAN DESCENDING과 STOPKEY가 나오는 것을 눈여겨 보시면 됩니다.
-- 쿼리일부...
SELECT
cmpgn_nm
, (
SELECT MIN(cmpgn_qstn_num)
FROM
(SELECT cmpgn_num, cmpgn_qstn_num
FROM zcam_qstn_brief
ORDER BY cmpgn_num, cmpgn_qstn_num DESC
) zqb
WHERE zqb.cmpgn_num = zcb.cmpgn_num
AND ROWNUM <= 10
) AS cmpgn_qstn_num -- max 10개 중 min값을 퀵하게 search
FROM zcam_cmpgn_brief zcb
WHERE cmpgn_num = 'BBA20071029008'
-- 실행계획
Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
SELECT STATEMENT Optimizer Mode=FIRST_ROWS 1 1
SORT AGGREGATE 1 19
COUNT STOPKEY
VIEW 1 19 1
INDEX RANGE SCAN DESCENDING ZCAM.ZCAM_QSTN_BRIEF_N1 1 32 1
INDEX UNIQUE SCAN ZCAM.ZCAM_CMPGN_BRIEF_PK 1 15 1
index_desc 힌트를 쓴 계획과 view만 빼고 거의 똑같죠?
또한 제가 위에서 더 좋은 경우라고 말한 것은 다음과 같습니다.
인덱스힌트의 가장 큰 단점은 누군가 고의로 또는 실수로 인덱스 컬럼순서를 변경하면 순서를 보장받지 못한다는 것이지요.
그래서 일반적으로는 인덱스힌트로 페이징을 유도하지만 위 내용이 가능한 환경이라면 인덱스힌트 방법은 정확한 값을 보장받지 못할 확률이 0.0001%라도 있기 때문에 튜닝 시 그다지 권장하지 않습니다...참고하세요...^^;
건승하시길...수고하세요~~