LIKE vs CONTAINS на SQL Server

Какой из следующих запросов выполняется быстрее (LIKE vs CONTAINS)?

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

или

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

Ответ 1

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

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


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

SELECT * FROM table WHERE CONTAINS(Column, 'test');

Ответ 2

CONTAINS Ищет точные или нечеткие (менее точные) совпадения с одиночными словами и фразами, слова на некотором расстоянии друг от друга или взвешенные совпадений в SQL Server.

КОНТЕЙНЕРЫ могут искать:

  • Слово или фраза.
  • Префикс слова или фразы.
  • Слово рядом с другим словом.
  • Слово, извергаемое из другого (например, слово-драйв - это флексивный стержень дисков, управляемый, управляемый и управляемый).
  • Слово, которое является синонимом другого слова с использованием тезауруса (например, слово "металл" может иметь синонимы, такие как "алюминий" и "сталь" ).

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

Ответ 3

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

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

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

Plan

Ответ 4

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

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

Ответ 5

Также попробуйте перейти от этого:

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

Для этого:

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

Первый найдет записи со значениями типа "это тест" и "тестовый сценарий - это план".

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

Ответ 6

Условие 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.