Использование индекса даты в Oracle - PullRequest
0 голосов
/ 03 января 2012

У меня есть запрос, который получает информацию об отправке.

Я бы хотел использовать индекс для столбца даты. Предложение where для этого столбца выглядит как shipment.end_alloc_date >= to_date( last week ). Когда я добавляю shipment.end_alloc_date <= to_date( next week ) индекс используется. Однако я не хочу использовать эту вторую строку.

Кто-нибудь знает, как заставить Oracle использовать этот индекс даты, используя только первое ограничение?


Таблица содержит около 180 000 строк, и оба sql получают 50 строк. Тем не менее, когда я запускаю план объяснения, индекс end_alloc_date используется только во втором sql. Почему я могу что-то сделать, чтобы заставить Oracle использовать индекс?

1) select <some data> from shipment where shipment.end_alloc_date >= to_date( last week )

2) select <some data> from shipment where shipment.end_alloc_date >= to_date( last week ) and shipment.end_alloc_date <= to_date( next week )

Ответы [ 2 ]

4 голосов
/ 03 января 2012

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

Итак, несколько вопросов к вам:

  1. Запрос выполняется слишком медленно? (Если нет, то почему вы беспокоитесь?)
  2. Что такое схема таблиц?
  3. Что такое индексы в таблицах?
  4. Каковы мощности рассматриваемых таблиц?
  5. Как именно выглядит полный запрос?
  6. Как выглядит план запроса?
  7. Какая пропорция строк в таблице удовлетворяет shipment.end_alloc_date >= to_date(last week)?
  8. Какая пропорция строк в таблице удовлетворяет shipment.end_alloc_date <= to_date(next week)?

Вы заметили, что эти условия не являются противоположностями друг другу? Я предполагаю, что это так, но это означает, что лучший план запроса для одного может отличаться от лучшего плана запроса для другого.

Оптимизатор будет учитывать ответы на вопросы 2-8 в этом списке и использовать свое суждение для выбора наилучшего способа ответа на запрос. Вы должны знать ответы на эти вопросы, если считаете, что оптимизатор не работает. Но без этой информации никто здесь не сможет оказать вам большую помощь, кроме смутного махания рукой «ищите подсказки оптимизатора в руководстве».

2 голосов
/ 03 января 2012

Это ошибочное мнение, что использование индекса - это самый быстрый способ выполнить запрос.

Я полагаю, что Оптимизатор решил, что более эффективно не использовать индекс, если указано только 'shipment.end_alloc_date> = to_date (последняя неделя)'.

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

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