Индексированный запрос вместе с условиями без индекса

Ниже приводится запрос, который я выполняю.

select col1, col2 from table1 where col1 in (select table2.col1 from table2) and col2 = 'ABC' ;
  • В table1 индекс доступен для col2, индекс недоступен для col1.
  • У меня около 4 миллионов записей для ABC в table1.
  • Общий размер table1 составляет около 50 миллионов.
  • Размер table2 меньше. Около 1 миллиона. (В этой таблице нет индексов)

Запрос занимает много времени. Если я удалю условие «in (select table2.col1 from table2)», запрос будет вести себя так, как требуется индексированному запросу.

Мой вопрос: если у нас есть индексированный столбец, который используется в предложении where, и мы включаем условие для неиндексированного столбца (в частности, условие in), есть ли вероятность снижения производительности? План объяснения запроса не дает намеков на неиндексную выборку.

Кроме того, имеет ли значение порядок условий? Т.е. в случае, если я укажу предложение индекса перед предложением без индекса, будет ли Oracle применять предложение без индекса только к выбранному подмножеству?

Заранее спасибо.


person Ricketyship    schedule 17.05.2013    source источник
comment
На выполнение плана влияют многие факторы. сначала перепишите запрос, как он есть на самом деле - соединение select t1.col1, t2.col2 from table1 t1 , table2 t2 where t1.col1 = t2.col1 and col2 = 'ABC'. во-вторых, убедитесь, что вы получили правильную статистику по обеим таблицам begin dbms_stats.gather_table_stats('table1,table2',cascade=>true); end;, затем выполните запрос и опубликуйте план выполнения.   -  person haki    schedule 17.05.2013


Ответы (1)


Порядок ваших предикатов не имеет значения. Оптимизатор определяет это. Это не так просто, как «индекс всегда лучше», поэтому оптимизатор пытается оценить «селективность» каждого предиката, а затем определить «лучший» порядок.

Если определено, что один предикат приводит к очень малой части таблицы, а индекс существует, вероятно, будет использован индексированный доступ. В вашем случае я не думаю, что индекс вам поможет, если только строки физически не отсортированы (на диске) по col2.

Если вы поделитесь планами выполнения, мы, вероятно, сможем вам помочь.

person Ronnis    schedule 17.05.2013