Как показано ниже, между моими таблицами A и B. существует простое соединение. Кроме того, на каждой таблице, которая объединена с оператором Or, есть условие.Оракул не использует определенные индексы
SELECT /*+ NO_EXPAND */
* FROM IIndustrialCaseHistory B ,
IIndustrialCaseProduct A
where (
A.ProductId IN ('9_2') OR
contains(B.KeyWords,'%some text goes here%') <=0
)
and (B.Id = A.IIndustrialCaseHistoryId)
На ProductId определен индекс дерева b, а для KeyWords - индекс функции. , но я не знаю, почему моя доза плана выполнения не использует эти индексы и полностью выполняет доступ к таблице? , как я нашел в this URL-адрес подсказки оптимизации NO_EXPAND может использовать индексы в плане выполнения (подсказка NO_EXPAND запрещает оптимизатору на основе затрат рассматривать OR-расширение для запросов с условиями ИЛИ или IN-списками в предложении WHERE). Но я не видел никакого использования определенных индексов
Что это проблема оракула с моим запросом ?!
Без каких-либо данных или схемы это сложно сказать. Как определяются индексы и насколько они избирательны? (т. е. какая доля строк таблицы соответствует этим индексам?) Обновлены ли ваши данные? Используются ли какие-либо индексы? Возможно, показ плана исполнения был бы полезным, с подсказкой и без нее. –
Есть ли указатели на 'B.Id' и' A.IIndustrialCaseHistoryId'? Если да, использует ли запрос один из них в плане выполнения? OR-Expansion может использоваться в случаях, когда OR объединяет два выражения, которые относятся к столбцам ** из одной и той же таблицы **, OR в вашем вопросе объединяет столбцы из разных таблиц (join), поэтому NO_EXPAND-подсказка бесполезна в этом случае, потому что Oracle не рассматривает преобразование OR-расширения. – krokodilko
да, B.Id - это первичный ключ B и A.A.IIndustrialCaseHistoryId - это внешний ключ, который ссылается на B.Id, и есть индексы для обоих из них. но в моем плане есть всего 2 стола полный доступ! спасибо, но можете ли вы дать ссылку на предложение о OR-Expansion? – Hamed