2016-04-18 2 views
1

Я пытаюсь реализовать функцию «Широкий поиск», которая должна использоваться для поиска всех полей в БД.SQL Server: медленный запрос, много понравившихся

Параметры запроса ниже: «% horse%», а моя локальная БД выполняет это примерно через 15 секунд.

Когда я использую параметр «% [^ A-Za-z0-9] horse [^ A-Za-z0-9]%", чтобы сделать «лошадь» независимым словом. Запрос занимает 30 + секунд.

ДБ содержит 3000 объектов. Можно ли оптимизировать запрос для работы в приличное время? или я должен рассматривать что-то вроде полнотекстового индекса?

+0

Просьба представить ваш план выполнения и «DDL» для ваших таблиц. – Devart

+0

, в то время как динамический SQL является болью и может быть опасным, иногда лучше построить строку запроса только с выбранными опциями, а затем выполнить ее, а не много или операторы – Jeremy

+0

также проверить эту статью на кучу различных параметров. http://www.sommarskog.se/dyn-search.html – Jeremy

ответ

1
  1. Использование DISTINCT указывает на то, что у вас может быть некорректная модель данных.
  2. Проверка на NULL кажется излишней.
  3. Добавление пространства для всех значений столбца страшная мысль, которая будет замедлять ваш запрос, потому что это не sargable:

Попробуйте этот синтаксис (для всех столбцов) в предложении WHERE вместо

(tblCollection.CollectionID like '%[^A-Za-z0-9]horse[^A-Za-z0-9]%' escape '\' or 
tblCollection.CollectionID like 'horse[^A-Za-z0-9]%' escape '\' or 
tblCollection.CollectionID like '[^A-Za-z0-9]horse' escape '\') 
+0

Спасибо! 2. и 3. уменьшено время от> 30 секунд до примерно 15 секунд. Можете ли вы объяснить, почему вы проверили бы все 3 случая в вашем примере? хватит ли только первого? – GINGERT

+0

wpuld не выбирает строки с столбцами, начинающимися или заканчивающимися на лошади, если вы исключаете последние 2 –