Можно ли выбрать значение (ы) из поставщикаf, где s.name LIKE '% search%' заказать по s.name, используя индекс, чтобы сделать такой поиск? Я знаю, что можно создать индекс для имени, но для такого поиска я не знаю, как все работает.
Да, но Oracle может не использовать индекс, основанный на статистике.Вы можете сказать Oracle использовать индекс с помощью подсказки, но действительно ли индекс действительно поможет, будет зависеть от ваших данных. Предположим, у вас есть эта таблица и индекс:
create table t (id integer primary key, text varchar2(50), other_cols...);
create index t_i on t (text);
Вы тогда это сделать выбор:
select * from t where text like '%something%';
Есть два очевидных способа это вопрос можно ответить:
- Полное сканирование таблицы на Т
- Проверка полного индекса на T_I, затем 1 ROWID-поиск по T на результат, найденный в T_I.
Предположим, что T имеет 100 000 строк, и только 5 из них соответствуют вашим критериям поиска. Предположим также, что таблица T занимает 5000 блоков, а индекс T_I занимает 1000 (т. Е. Только 20% от размера T).
Фактическая стоимость запросов в терминах читает тогда:
- 5000 считывает (Т)
- 1000 считывает (из T_i), а затем 5 считывает Т с помощью ROWID = 1005 считывает
Очевидно, что в этом случае индекс лучше. Тем не менее, Oracle стремится предположить, что LIKE запрос будет возвращать 5% строк (т.е. 5000 строк), поэтому его предполагаемые расходы (в прочтений) будет:
- 5000 читает (Т)
- 1000 (из T_I), а затем 5000 чтений от T по ROWID = 6000 читает
Следовательно, в этом примере Oracle отправится на полное сканирование таблицы, хотя поиск по индексу будет быстрее. Можно намекнуть запрос использовать индекс:
select /*+ index(t t_i) */ from t where text like '%something%';
Однако, обратите внимание, что это только лучше, если вы уверены, что запрос будет возвращать менее чем на 5% строк большую часть времени.
+1: Oracle автоматически создает индекс для первичного ключа, если индекс для столбца (ов) еще не существует. –
Re (2), ** ** возможно создать индекс для поиска с LIKE '% text%', хотя вероятность того, что Oracle решит использовать индекс, невелика. Вы могли бы использовать подсказку, чтобы заставить Oracle использовать индекс, если бы вы были уверены, что он будет работать лучше. –
@Tony Andrews: Спасибо за дополнительную информацию об индексах - скорректировал мое сообщение и добавил ссылку на ваш ответ. –