아래의 경우에 인덱스를 타지 않은 이유는 Optimizer가 인덱스를 타지 않는 것이 비용이 적게 들 것이라고 판단했기 때문입니다.
DB2의 optimizer는 항상 최소의 비용이 드는 접근경로를 설정해 작업을 수행합니다.
아래의 경우, 인덱스가 있다하더라도 테이블 전체의 데이터를 가져오는 내용이기 때문에 인덱스를 타고 테이블로 가는 것 보다 테이블로 바로 가는 것이 빠르다고 optimizer가 결정했기 때문일 것입니다.
인덱스를 타고 싶으시다면, * 대신에 name 혹은 name과 다른 컬럼하나 정도를 쓰시면 optimizer가 index를 선택할 가능성이 높습니다.
물론 where 조건에 name=' '을 주시면 더 가능성이 높아질 수 있습니다.
또한 runstats이라는 유틸리티를 돌리시면 optimizer에게 최신의 정보를 알려 줄 수 있습니다...
-- 노성섭 님이 쓰신 글:
>> create table cusinfo(name varchar(10), id varchar(10), birthday varchar
>> (8));
>> 이렇게 테이블을 만들고, name 컬럼으로 인덱스를 만들었습니다.
>> 그리고 테이블에 10만건의 데이터를 넣었습니다.
>> name 순으로 정렬된 데이터를 order by를 쓰지않고 가져오고 싶어서 다음과 같은 SQL
>> 문을 썼습니다.
>>
>> select *from cusinfo where name > ' ';
>>
>> 100건정도의 작은 데이터를 넣었을때는 그렇게 되더군요...
>>
>> 그런데 10만건을 넣어놓으니까, 정렬된 순서가 아닌 제일먼저 넣었던 데이터가 먼저 나
>> 오더군요..
>>
>> 뭐가 잘못된거죠??
>>
>> 옵티마이져의 유형때문인가요? 아니면 다른 이유가 있는건가요??
>>
>> 제가 SQL문을 잘못써서 인가요??
>>
>> 고수님들의 답변 부탁드립니다..
|