INDEX 컬럼 순서에 따라 결과 값이 달라진다.
결과적으로, select * from ( 메인 쿼리(/*+ index_desc */) order by min/max대상) where rownum = 1
과 같이 한번 감싸줘야 의도한 대로 결과값이 나온다.
(다소 성능은 감소되지만... index drop 이나 unusable, plan 변경으로 인한 데이터 오류보다 무섭진 않겠지...)
아래는 test script.
drop table test5 cascade constraints purge;
결과적으로, select * from ( 메인 쿼리(/*+ index_desc */) order by min/max대상) where rownum = 1
과 같이 한번 감싸줘야 의도한 대로 결과값이 나온다.
(다소 성능은 감소되지만... index drop 이나 unusable, plan 변경으로 인한 데이터 오류보다 무섭진 않겠지...)
아래는 test script.
drop table test5 cascade constraints purge;
create table test5
(a number, b number, c number);
insert into test5 values (1, 1, 6);
insert into test5 values (1, 3, 5);
insert into test5 values (1, 2, 4);
insert into test5 values (2, 6, 3);
insert into test5 values (2, 1, 2);
insert into test5 values (3, 5, 1);
insert into test5 values (4, 0, 1);
insert into test5 values (5, 5, 4);
commit;
create index test5_n1 on test5(a, b, c);
create index test5_n2 on test5(a, c, b);
create index test5_n3 on test5(a);
-- 값: 3
-- 값: 1
-- 값: 2
create index test5_n3 on test5(a);
select /*+ index_desc(t test5_n1) */ rowid, b
from test5 t
where a = 1
and rownum = 1; -- 값: 3
select /*+ index_desc(t test5_n2) */ rowid, b
from test5 t
where a = 1
and rownum = 1; -- 값: 1
select /*+ index_desc(t test5_n3) */ rowid, b
from test5 t
where a = 1
and rownum = 1; -- 값: 2