DB

min/max 쿼리 튜닝시 random access 감소를 위한 목적으로 index_desc + rowid 사용시 주의할 것

Lawmin 2011. 5. 25. 17:50
INDEX 컬럼 순서에 따라 결과 값이 달라진다.

결과적으로, 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); 

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