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");
sql-server
performance
contains
sql-like
użytkownik667429
źródło
źródło
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ć:źródło
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ć.źródło
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łnotekstowyadventure
szukał,works.com
a następnie wyszukiwał i łączył wyniki.źródło
Spróbuj także zmienić z tego:
Do tego:
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 ”.
źródło
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.