Oracle не использует индекс в простом запросе, несмотря на подсказку - PullRequest
0 голосов
/ 24 октября 2018

У меня есть таблица с колонкой status .Это строковый обнуляемый столбец.У меня также есть индекс только по этому полю.Почему следующий запрос не использует индекс?

select /*+ index(m IDX_STATUS) */ * from messages m where m.status = :1

1 Ответ

0 голосов
/ 24 октября 2018

Попробуйте выполнить запрос без именованных (bind) параметров.Иногда это имеет большое значение.

select * from messages m where m.status = 'P'

Может оказаться, что вам даже не нужен совет для запуска использования индекса.

Возможное объяснение состоит в том, что столбец содержит много одинаковыхзначения, например 90% строк, имеют status = 'D' ( столбец с низкой мощностью ).Теперь мы можем понять Oracle, почему он не использовал индекс :) ​​Это просто не имеет смысла для значения 'D', но разумно для других значений.Я бы предпочел, чтобы Oracle рассмотрел мою подсказку ( Я знаю лучше ), но это кажется невозможным.

В общем, есть чрезвычайно полезное руководство Руководство по настройке Oracle SQL: индексигнорируется .Тем не менее, в нем не упоминается ситуация, когда пропуск параметра bind устраняет проблему.Вот почему я настаивал на том, чтобы задать вопрос о SO.

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