Подавляет ли предложение OR индексы в oracle? - PullRequest
1 голос
/ 06 сентября 2010

Подавляет ли предложение ИЛИ Индексы, если да, может ли кто-нибудь предоставить соответствующий пример?

create table test2(field1 varchar2(100),field2 varchar2(100),
                   field3 number,field4 varchar2(100));

create index test2_idx1 on test2(field1);

create index test2_idx2 on test2(field3);

declare
  j number :=1;
begin
  for i in 1..500000 loop
    insert into test2 (field1,field2,field3,field4)
    values('field1='||j,'field2='||i,j,'field4='||‌​i);
    if (i mod 1000)=0 then 
      j:= j+1;
    end if; 
  end loop;
  commit;
end;

EXEC DBMS_STATS.GATHER_TABLE_STATS ('user', 'test2');

select * from test2 where field1='field1=1' or field3=1;

Ответы [ 3 ]

9 голосов
/ 06 сентября 2010

Нет, использование предложения OR не приводит к тому, что индекс не будет использоваться.
Предложение OR только разделяет путь принятия решения о фильтрации и может быть очень дорогостоящим для этого в зависимости от сложности запроса и данных.

3 голосов
/ 07 сентября 2010

Не знаю, что побудило вас задать этот вопрос, но помните:

"Полное сканирование не всегда зло; индексы не всегда хорошо" (Том Кайт в «Эффективном оракуле по замыслу»)

0 голосов
/ 21 марта 2011

Вы всегда можете сделать UNION между обоими предложениями, и будет легче заставить индексы работать

select * from test2 where field1='field1=1' union select * from test2 where field3=1;

В любом случае, я запускаю ваш пример сценария, и индекс используется.

it works in my machine

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...