% в начале предложения лайка - PullRequest
4 голосов
/ 08 октября 2009

Я слышал, что не рекомендуется использовать% в начале предложения LIKE в SQL Server по соображениям производительности. Почему это так?

Некоторые подробности помогут мне понять влияние этой проблемы.

Ответы [ 7 ]

13 голосов
/ 08 октября 2009

A % в начале предложения LIKE означает, что индексы совершенно бесполезны. Если есть статический текст для привязки шаблона к %, то по крайней мере потенциальная полезность может быть получена из индексов.

5 голосов
/ 08 октября 2009

почему LIKE "% ..." не годится? Вы не можете использовать какой-либо индекс и должны сканировать всю таблицу.

вот хороший пример:

иди в телефонную книгу и найди мне все имена, которые соответствуют "% ch". Что будет занять много времени, так как вы не может использовать кластерный индекс и должен сканировать всю книгу!

Учитывая данные 'abcdefg'

WHERE Column1 LIKE '%cde%'  --can't use an index

WHERE Column1 LIKE 'abc%' --can use and index

WHERE Column1 Like '%defg' --can't use an index, but see note below

Примечание. Если у вас есть важные запросы, требующие «% defg», вы можете использовать постоянный вычисляемый столбец, в котором вы REVERSE () столбец, а затем индексировать его. Затем вы можете запросить:

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index

чтобы добавить сохраненный вычисляемый столбец (который переворачивает строку) и индексировать по нему, используйте этот код:

ALTER TABLE YourTable ADD ReversedYourString  AS REVERSE(YourString) PERSISTED 

CREATE NONCLUSTERED INDEX IX_YourTable_ReversedYourString 
ON YourTable (ReversedYourString) 
5 голосов
/ 08 октября 2009

%foo в основном говорит: «Все строки заканчиваются на« foo »». Чтобы отфильтровать их, SQL-сервер должен сканировать всю таблицу (в худшем случае) и проверять каждую строку. Вот почему это так дорого.

2 голосов
/ 08 октября 2009

Если у вас есть% в начале предложения, механизм запросов не может сгенерировать план запроса, который использует индексы, но должен выполнять сканирование таблицы.

2 голосов
/ 08 октября 2009

наличие его в любом месте приведет к снижению производительности, поскольку нет индекса содержимого текстового поля.

С ним в начале он должен выполнить поиск в худшем случае до конца текстового поля.

1 голос
/ 08 октября 2009

Многие люди объясняют, почему col1, такой как "% ...", плох.

Вот потенциальный обходной путь, если вы часто сталкиваетесь с этой ситуацией:

  • создать другой столбец, скажем, col2
  • написать триггер при вставке / обновлении col1, который заполняет col2 col1 "назад"
  • создать индекс на col2
  • если ваше приложение должно искать col1 как '% ...', ищите col2 как '...%' вместо этого (или даже substr (col1 и т. Д.) = '...' [простите мой оракул] говор]

Мы использовали его для поиска последних цифр VIN (Идентификационный номер транспортного средства) или номера SocialSecurity, и он отлично работал! Улучшение производительности было действительно отличным

0 голосов
/ 08 октября 2009

полное сканирование таблицы

что администраторы боятся больше всего;)

Поскольку поиск не может быть ускорен индексом, сервер должен циклически просмотреть каждую запись в таблице (= сканирование таблицы) и проверить, соответствует ли запись выражению LIKE.

Это может не быть проблемой для небольших таблиц, но, безусловно, для больших таблиц с большим количеством строк, так как все записи должны быть извлечены с диска.

Это противоположно сканированию индекса, где критерии поиска позволяют серверу использовать индекс, чтобы ограничить поиск (в идеале) небольшим набором записей.

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