Какой из следующих запросов выполняется быстрее (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
или
SELECT * FROM table WHERE Contains(Column, "test");
Какой из следующих запросов выполняется быстрее (LIKE vs CONTAINS)?
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 Ищет точные или нечеткие (менее точные) совпадения с одиночными словами и фразами, слова на некотором расстоянии друг от друга или взвешенные совпадений в SQL Server.
КОНТЕЙНЕРЫ могут искать:
Запустив оба запроса на экземпляре SQL Server 2012, я могу подтвердить, что первый запрос был самым быстрым в моем случае.
Запрос с ключевым словом LIKE
показал кластерное сканирование индекса.
CONTAINS
также имел кластерный сканирование индекса с дополнительными операторами для полного совпадения текста и объединения слияния.
Я думаю, что 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;
Первый найдет записи со значениями типа "это тест" и "тестовый сценарий - это план".
Последний также найдет записи со значениями, такими как "Я тестирую это" и "это самый большой".
Условие LIKE, которое мы можем применить к любому из столбцов, не проверяет столбец INDEXED или нет.
Но условие CONTAINS мы можем применять только к столбцам INDEXED. Если мы попытаемся применить к столбцам, отличным от INDEXED, мы получим следующую ошибку.
ORA-20000: Oracle Text error:
DRG-10599: column is not indexed
20000. 00000 - "%s"
*Cause: The stored procedure 'raise_application_error'
was called which causes this error to be generated.
*Action: Correct the problem as described in the error message or contact
the application administrator or DBA for more information.