Które z poniższych zapytań jest szybsze (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
lub
SELECT * FROM table WHERE Contains(Column, "test");
Które z poniższych zapytań jest szybsze (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
lub
SELECT * FROM table WHERE Contains(Column, "test");
Odpowiedzi:
Drugi (zakładając, że masz na myśli CONTAINS
i faktycznie umieścisz go w prawidłowym zapytaniu) powinien być szybszy, ponieważ może używać jakiejś formy indeksu (w tym przypadku indeksu pełnotekstowego). Oczywiście ta forma zapytania jest dostępna tylko wtedy, gdy kolumna ma indeks pełnotekstowy. Jeśli tak nie jest, dostępna jest tylko pierwsza forma.
Pierwsze zapytanie, używając LIKE, nie będzie w stanie użyć indeksu, ponieważ zaczyna się od znaku wieloznacznego, więc zawsze będzie wymagało pełnego skanowania tabeli.
CONTAINS
Zapytanie powinno być:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? Co z tego? Oryginalna forma pytania miała, Column CONTAIN("%test%",Column)>0
która nie była blisko ważna. To nadal nie jest całkowicie poprawne.
Po uruchomieniu obu zapytań w wystąpieniu programu SQL Server 2012 mogę potwierdzić, że pierwsze zapytanie było najszybsze w moim przypadku.
Zapytanie ze LIKE
słowem kluczowym pokazało skanowanie indeksu klastrowego.
CONTAINS
Miał również skanowanie indeksu klastrowego z dodatkowych operatorów do pełnego meczu tekstu i scalanie przyłączyć.
LIKE
Zapytanie z wiodącą zamiennika nie będzie w stanie efektywnie wykorzystać część indeksu. Będzie musiał po prostu zeskanować całość. Chociaż niewątpliwie mogą zaistnieć pewne okoliczności, w których pełne skanowanie CI działa lepiej niż zapytanie przy użyciu indeksu pełnotekstowego (być może, jeśli na przykład pasuje bardzo duża liczba wierszy), będzie to w dużej mierze wyjątek, a nie jakakolwiek ogólna reguła, którą „można potwierdzić „.
LIKE
.
Myślę, że CONTAINS
zajęło to więcej czasu i było używane, Merge
ponieważ w zapytaniu miałeś myślnik („-”) adventure-works.com
.
Myślnik jest słowem przerywanym, więc CONTAINS
przeszukiwany indeks pełnotekstowy adventure
szukał, works.com
a następnie wyszukiwał i łączył wyniki.
Spróbuj także zmienić z tego:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Do tego:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
Pierwszy znajdzie rekordy o wartościach takich jak „ to test ”, a „ przypadek testowy to plan ”.
Ten drugi znajdzie również rekordy o wartościach takich jak „ testuję to ” i „ to jest największe ”.
CONTAINS
, wspomina tylko o użyciu terminów takich jak „test *”, a nie terminów takich jak „ test” i niepełnego wyszukiwania podciągów jak „* test ”. Jednak tego nie próbowałem.