Как создать индекс для динамических строк поиска - PullRequest
4 голосов
/ 23 января 2010

У меня есть небольшая БД, только для академических целей, и у меня есть максимум таблицы объектов. Я создал модель отношения сущностей (ERM) в Power Designer, и программа по умолчанию создает индекс для серийных идентификаторов для каждой таблицы.

  1. Я хочу знать, как мне использовать индекс как это на запрос. Скажем, я бы хочу найти товар по его идентификатору, но используя его индекс.
  2. Можно ли сделать select value(s) from supplierf where s.name LIKE '%search%' order by s.name используя индекс, чтобы сделать поиск как тот? Я знаю, что это возможно создать индекс для имени, но для поиска вот так я не знаю как дела работа.

Позвольте мне сказать, что я знаю, что Oracle решает, когда или стоит ли использовать индекс в запросе, но мне, возможно, придется хотя бы попробовать использовать индексы в моем проекте BD

Ответы [ 3 ]

6 голосов
/ 23 января 2010

1. Определяя столбец как PRIMARY KEY (это, скорее всего, ваш столбец id), Oracle неявно создает индекс для этого столбца. Скорее всего, он решит использовать этот индекс, когда у вас есть выбор с WHERE id=123). Вы можете указать подсказку в своем запросе, чтобы Oracle использовал индекс (в большинстве случаев), но это не обязательно для вас.

2. Oracle вряд ли будет использовать индекс для LIKE (если вы не знаете, что ваш текст начинается с искомой строки и вы можете использовать 'xyz%'). См. Сообщение Тони Эндрюса для получения дополнительной информации о том, когда и как использовать индекс для полных сканирований таблицы.

Статья о поиске в предложении Oracle LIKE с текстовыми индексами должна содержать информацию о способе обработки полнотекстового поиска.

3 голосов
/ 24 января 2010

Возможно ли выбрать значение (я) из поставщика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%';

Существует два очевидных способа ответа на этот запрос:

  1. Полное сканирование таблицы на T
  2. Полное сканирование индекса по T_I, затем 1 поиск ROWID T для результата, найденного в T_I.

Предположим, T имеет 100 000 строк, и только 5 из них соответствуют вашим критериям поиска. Предположим также, что таблица T занимает 5000 блоков, а индекс T_I занимает 1000 (т. Е. Только 20% размера T).

Фактическая стоимость запросов с точки зрения чтения составляет:

  1. 5000 операций чтения (T)
  2. 1000 операций чтения (T_I), за которыми следуют 5 операций чтения T и ROWID = 1005 операций чтения

Очевидно, что в этом случае индекс лучше. Однако Oracle склонен полагать, что запрос LIKE вернет 5% строк (то есть 5000 строк), поэтому его предполагаемые затраты (в чтениях) будут:

  1. 5000 операций чтения (T)
  2. 1000 операций чтения (T_I), за которыми следуют 5000 операций чтения T с ROWID = 6000 операций чтения

Следовательно, в этом примере Oracle пойдет на полное сканирование таблицы, хотя поиск по индексу будет быстрее. Вы можете намекнуть запрос, чтобы использовать индекс:

select /*+ index(t t_i) */ from t where text like '%something%';

Однако обратите внимание, что это будет лучше, если вы уверены, что запрос будет возвращать менее 5% строк в большинстве случаев.

3 голосов
/ 23 января 2010

Относительно вашего пункта 1.): Я не понимаю, что вы имеете в виду: если вы разумно назначаете индексы, вы можете использовать подсказки индекса для принудительного использования индекса, но гораздо лучше позволить Сначала оптимизатор выполняет свою работу, а затем, если ваш индекс не используется, проанализируйте , почему (возможно, использование индекса при определенных обстоятельствах не самый быстрый способ). Например, если вы комбинируете поиск по идентификатору с поиском с использованием подстановочного совпадения, оптимизатор может решить, что в случае необходимости полного сканирования таблицы (из-за вашего термина '%search%') дополнительной выгоды не будет. используя индекс в вашем столбце идентификатора.

Относительно вашего пункта 2.): маловероятно, что индекс будет использоваться, если вы используете подстановочный знак в начале поискового запроса. Для такого поиска, посмотрите синтаксис полнотекстового Oracle здесь:

http://www.oracle.com/technology/products/text/index.html

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