Возможно ли выбрать значение (я) из поставщика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
- Полное сканирование индекса по T_I, затем 1 поиск ROWID T для результата, найденного в T_I.
Предположим, T имеет 100 000 строк, и только 5 из них соответствуют вашим критериям поиска. Предположим также, что таблица T занимает 5000 блоков, а индекс T_I занимает 1000 (т. Е. Только 20% размера T).
Фактическая стоимость запросов с точки зрения чтения составляет:
- 5000 операций чтения (T)
- 1000 операций чтения (T_I), за которыми следуют 5 операций чтения T и ROWID = 1005 операций чтения
Очевидно, что в этом случае индекс лучше. Однако Oracle склонен полагать, что запрос LIKE вернет 5% строк (то есть 5000 строк), поэтому его предполагаемые затраты (в чтениях) будут:
- 5000 операций чтения (T)
- 1000 операций чтения (T_I), за которыми следуют 5000 операций чтения T с ROWID = 6000 операций чтения
Следовательно, в этом примере Oracle пойдет на полное сканирование таблицы, хотя поиск по индексу будет быстрее. Вы можете намекнуть запрос, чтобы использовать индекс:
select /*+ index(t t_i) */ from t where text like '%something%';
Однако обратите внимание, что это будет лучше, если вы уверены, что запрос будет возвращать менее 5% строк в большинстве случаев.