В основном индекс упорядочивает значения в алфавитно-цифровом порядке. Учитывая предикат, он просматривает индекс, начинающийся с переднего края значения. Таким образом, для key = 'ABC'
он переходит в часть индекса со значениями, начинающимися с A
, и ищет оттуда.
Теперь мы рассмотрим ваш запрос, и мы видим, что ни один из предикатов в вашем предложении WHERE не имеет ведущих значений. lower(city) LIKE '%city%'
может буквально соответствовать чему-либо от aaa city
до zzz city
. Так что потенциально каждая запись в таблице. Индекс бесполезен в таком сценарии, и полное сканирование таблицы является более эффективным.
(кстати, применяя функцию к колонку, как и в lower(city)
также предотвратить использование индекса, если у вас есть соответствующий индекс-функция на этой колонке.)
Если вы хотите, чтобы сделать много такого рода запросов вы должны исследовать функциональность Oracle Text. Он использует специальные индексы для поддержки бесплатных текстовых операторов, таких как . Для этих индексов есть накладные расходы, поэтому вам нужно понять, какие выгоды вы получите. Find out more.
И вопрос в том, что? (Да, так оно и работает, эти LIKE не могут использовать индексы.) – jarlh
Oracle не может использовать индекс для такого условия LIKE. –
Oracle * может * использовать индекс, но это не обязательно будет быстрее, чем полное сканирование таблицы. –