Який із наступних запитів швидше (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
? Що з цього? Оригінальна форма запитання мала те, 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 ". Я не пробував цього.