Как против содержит на SQL Server - PullRequest
179 голосов
/ 22 сентября 2011

Какой из следующих запросов быстрее (как против СОДЕРЖИТ)?

SELECT * FROM table WHERE Column LIKE '%test%';

или

SELECT * FROM table WHERE Contains(Column, "test");

Ответы [ 4 ]

148 голосов
/ 22 сентября 2011

Второй (при условии, что вы имеете в виду CONTAINS и фактически поместите его в правильный запрос) должен быть быстрее, поскольку он может использовать некоторую форму индекса (в данном случаеполнотекстовый индекс).Конечно, эта форма запроса доступна только , если столбец в полнотекстовом индексе.Если это не так, тогда доступна только первая форма.

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


Запрос CONTAINS должен быть:

SELECT * FROM table WHERE CONTAINS(Column, 'test');
13 голосов
/ 01 марта 2014

Запустив оба запроса на экземпляре SQL Server 2012, я могу подтвердить, что первый запрос был самым быстрым в моем случае.

Запрос с ключевым словом LIKE показал сканирование кластерного индекса.

CONTAINS также имел сканирование кластерного индекса с дополнительными операторами для полнотекстового совпадения и объединения слиянием.

Plan

5 голосов
/ 18 ноября 2015

Также попробуйте изменить это значение:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

На это:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

В первом будут найдены записи со значениями, такими как " это тест "и " контрольный пример - это план ".

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

5 голосов
/ 28 мая 2015

Я думаю, что CONTAINS заняло больше времени и использовало Merge, потому что в вашем запросе была тире ("-") adventure-works.com.

Тире - это ключевое слово, поэтому CONTAINS искал полнотекстовый индекс для adventure, а затем works.com и объединил результаты.

...