test05라는 테이블에 ymd라는 컬럼이 있고 PK입니다.
여기에 데이터가
19961231
19970630
19971231
19980331
19980630
이런식으로 들어있습니다.
여기서 INDEX_DESC(TEST05 TEST05_PK) 이렇게 힌트를 주었을때
19980630이 나와야 되는거 아닌가요?
힌트가 걸리지 않고 계속 힌트걸기전과 똑같이 나오네요..
========================================================
select a.ymd, b.ymd, a.us_amount, a.us_amount * b.exc_rate
from test05 b, test04 a,
where b.ymd = (select /*+ INDEX_DESC(test05 test05_pk) */ ymd
from test05 where ymd < a.ymd and rownum = 1)
인덱스가 안먹네요..
비슷한 쿼리를 만들어 테스트해봤습니다.
정상적으로 인덱스 타서 결과가 나오네요.
그런데 굳이 힌트 안쓰고 MAX 로 구하는게 여러모로 더 좋습니다.
MAX 를 쓰면 (INDEX_DESC + ROWNUM) 과 동일한 성능이 나오며, 오류의 가능성은 없습니다.
SELECT a.deptno aa , b.deptno bb FROM dept b , dept a WHERE b.deptno = (SELECT /*+ INDEX_DESC(dept pk_dept) */ deptno FROM dept WHERE deptno < a.deptno AND ROWNUM = 1 ) ; -- 결과 -- AA BB -- -- 20 10 30 20 40 30
인덱스 항목에 대한 MIN/MAX 처리는 이미 최적화 되어 있습니다.
- 인덱스 1건만 읽고 멈추죠.
INDEX_DESC 힌트 + ROWNUM = 1 의 경우
- 정상동작한다면? 마찬가지로 최적화된 답일 수 있습니다.
- 그러나 비정상 동작할 가능성에 대해 여러 책에서 언급하고 있는데요.
- 테이블을 관리하다보면 인덱스 명칭이 바뀔수도 있다는 거죠.
- 인덱스 명이 바뀌거나 인덱스 자체가 삭제되거나 한다면? 힌트는 무효화되고 비정상동작을 하게 됩니다.
인덱스가 없다면?
- (INDEX 힌트 + ROWNUM)은 부정확한 결과를 빠르게 리턴합니다.
- MIN/MAX 는 전체 스캔후 느리지만 정확한 결과를 반환합니다.
- 즉 인덱스가 있으면 동일한 성능을 내고
- 인덱스가 없으면 정확한 결과를 내는 MIN/MAX 를 선호해야 하겠지요.