SQL Server оптимизирует LIKE ('%%') запрос? - PullRequest
3 голосов
/ 18 февраля 2011

У меня есть Stored Proc, который выполняет поиск по записям.

Проблема в том, что некоторые критерии поиска, исходящие из интерфейса, могут быть пустой строкой.Таким образом, когда критерии не указаны, инструкция LIKE становится избыточной.

Как эффективно выполнить поиск или Sql Server?Или это оптимизирует запрос LIKE ('%%'), поскольку это означает, что сравнивать нечего?

Сохраненный процесс выглядит следующим образом:

ALTER PROC [FRA].[MCC_SEARCH]
@MCC_Code varchar(4),
@MCC_Desc nvarchar(50),
@Detail nvarchar(50)
AS
BEGIN             
       SELECT
             MCC_Code,
             MCC_Desc,
             CreateDate,
             CreatingUser

       FROM
              FRA.MCC (NOLOCK)
       WHERE
             MCC_Code LIKE ('%' + @MCC_Code + '%')
             AND MCC_Desc LIKE ('%' + @MCC_Desc + '%')
             AND Detail LIKE ('%' + @Detail + '%')
       ORDER BY MCC_Code

END

Ответы [ 3 ]

5 голосов
/ 18 февраля 2011

Что касается оптимального плана выполнения с использованием индекса - нет.Подстановочный подстановочный знак не позволяет использовать индекс, что приводит к сканированию.

Если у вас нет подстановочного знака и в конце поискового запроса, то этот сценарий можно оптимизировать - то, что я написал в блогеНекоторое время назад: Оптимизация с подстановочными знаками как LIKE

Обновление Чтобы уточнить мою точку зрения:LIKE 'Something%' - умеет использовать индексLIKE "% Something" - не может использовать индекс "из коробки".Но вы можете оптимизировать это, чтобы позволить ему использовать индекс, следуя «методике REVERSE», с которой я связан.LIKE "% Something%" - не может использовать индекс.Вы ничего не можете сделать, чтобы оптимизировать для LIKE.

4 голосов
/ 18 февраля 2011

Короткий ответ - нет Длинный ответ - абсолютно не

Оптимизирует ли он запрос LIKE ('%%'), так как онозначает, что сравнивать нечего?

Утверждение соответствует , потому что - это что-то для сравнения.Следующие значения эквивалентны

WHERE column LIKE '%%'
WHERE column IS NOT NULL

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

EDIT

Ресурс по процедурам динамического поиска в SQL Server:
Вы просто должны прочитать эту статью Эрланда Соммарского, SQL Server MVP http://www.sommarskog.se/dyn-search.html (выберите свою версию или прочитайте обе)

В противном случае, если вам нужна хорошая производительность при поиске в стиле CONTAINS, рассмотрите возможность использования полнотекстового движка SQL Server.

3 голосов
/ 18 февраля 2011

Если вы используете условие LIKE и задаете подстановочный знак (%) в качестве префикса строки поиска, SQL Server (и, как мне кажется, все другие СУБД) не сможет использовать индексы, которые могут существовать для этогоcolumn.

Я не знаю, оптимизирует ли он запрос, если вы используете пустой аргумент поиска ... Возможно, на ваш вопрос можно ответить, если вы посмотрите на план выполнения?

РедактироватьЯ только что проверил это, и план выполнения этого оператора:

select * from mytable

точно такой же, как этот план выполнения этого оператора:

select * from mytable where description like '%'

Оба SQLоператоры просто используют сканирование кластерного индекса.

...