2010-01-23 3 views
4

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

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

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

ответ

3

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

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

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

6

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

2. Вряд ли Oracle может использовать индекс для LIKE (если вы не знаете, что ваш текст начинается с искомой строки, и вы можете использовать «xyz%»). См. Tony Andrews' post для получения дополнительных сведений о том, когда и как использовать индекс для полного сканирования таблицы.

Статья о Oracle LIKE clause searches with text indexes должна содержать информацию о способе обработки полных текстовых запросов.

+0

+1: Oracle автоматически создает индекс для первичного ключа, если индекс для столбца (ов) еще не существует. –

+1

Re (2), ** ** возможно создать индекс для поиска с LIKE '% text%', хотя вероятность того, что Oracle решит использовать индекс, невелика. Вы могли бы использовать подсказку, чтобы заставить Oracle использовать индекс, если бы вы были уверены, что он будет работать лучше. –

+0

@Tony Andrews: Спасибо за дополнительную информацию об индексах - скорректировал мое сообщение и добавил ссылку на ваш ответ. –

3

Можно ли выбрать значение (ы) из поставщика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. Полное сканирование таблицы на Т
  2. Проверка полного индекса на T_I, затем 1 ROWID-поиск по T на результат, найденный в T_I.

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

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

  1. 5000 считывает (Т)
  2. 1000 считывает (из T_i), а затем 5 считывает Т с помощью ROWID = 1005 считывает

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

  1. 5000 читает (Т)
  2. 1000 (из T_I), а затем 5000 чтений от T по ROWID = 6000 читает

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

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

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

+0

+1: Спасибо, скорректировал мое сообщение и добавил ссылку на ваш ответ. –

+0

Спасибо, я исправил это сейчас. –

Смежные вопросы