Какой из следующих запросов быстрее (как против содержит)?
SELECT * FROM table WHERE Column LIKE '%test%';
или
SELECT * FROM table WHERE Contains(Column, "test");
Какой из следующих запросов быстрее (как против содержит)?
SELECT * FROM table WHERE Column LIKE '%test%';
или
SELECT * FROM table WHERE Contains(Column, "test");
Ответы:
Второй (при условии, что вы имеете в виду CONTAINS
, и фактически поместите его в правильный запрос) должен быть быстрее, потому что он может использовать некоторую форму индекса (в данном случае, полнотекстовый индекс). Конечно, эта форма запроса доступна, только если столбец имеет полнотекстовый индекс. Если это не так, то доступна только первая форма.
Первый запрос, использующий LIKE, не сможет использовать индекс, поскольку он начинается с подстановочного знака, поэтому всегда требует полного сканирования таблицы.
CONTAINS
Запрос должен быть:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? Что из этого? Первоначальная форма вопроса не имела Column CONTAIN("%test%",Column)>0
ничего общего с действительностью. Это все еще не совсем верно.
Запустив оба запроса на экземпляре SQL Server 2012, я могу подтвердить, что первый запрос был самым быстрым в моем случае.
Запрос с LIKE
ключевым словом показал сканирование кластерного индекса.
CONTAINS
Также был кластерный индекс сканирования с дополнительными операторами для полного текста матча и слиянием.
LIKE
Запрос с ведущим шаблоном не сможет эффективно использовать индексную часть. Это нужно будет просто отсканировать все это. Хотя, несомненно, могут быть некоторые обстоятельства, при которых полное сканирование CI работает лучше, чем запрос, использующий полнотекстовый индекс (возможно, если, например, соответствует очень высокий процент строк), это в значительной степени будет исключением, а не каким-то общим правилом, которое вы «можете подтвердить». ».
LIKE
.
Я думаю, что это CONTAINS
заняло больше времени и использовалось, Merge
потому что в вашем запросе была тире ("-")adventure-works.com
.
Тире это слово разрыв, поэтому CONTAINS
поиск производился по полнотекстовому индексу, adventure
а затем он искал works.com
и объединял результаты.
Также попробуйте изменить это:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
К этому:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
Первый найдет записи со значениями, такими как « это тест » и « контрольный пример - это план ».
Последний также найдет записи со значениями вроде « я проверяю это » и « это самое большое ».
CONTAINS
него упоминаются только префиксные термины, такие как «test *», а не суффиксные термины, такие как « test», и не полный поиск по подстроке, например «* test ». Я не пробовал, хотя.