Welke van de volgende zoekopdrachten is sneller (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
of
SELECT * FROM table WHERE Contains(Column, "test");
Antwoord 1, autoriteit 100%
De tweede (ervan uitgaande dat je CONTAINS
bedoelt, en eigenlijk zet het in een geldige zoekopdracht) zou sneller moeten zijn, omdat het een of anderevorm van index kan gebruiken (in dit geval een volledige tekstindex). Deze vorm van zoekopdracht is natuurlijk alleen beschikbaar alsde kolom in een volledige tekstindex staat. Als dit niet het geval is, is alleen het eerste formulier beschikbaar.
De eerste zoekopdracht, die LIKE gebruikt, kan geen index gebruiken, omdat deze begint met een jokerteken, en er dus altijd een volledige tabelscan nodig is.
De CONTAINS
-query moet zijn:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
Antwoord 2, autoriteit 8%
Na beide query’s op een SQL Server 2012-instantie te hebben uitgevoerd, kan ik bevestigen dat de eerste query in mijn geval het snelst was.
De zoekopdracht met het trefwoord LIKE
toonde een geclusterde indexscan.
De CONTAINS
had ook een geclusterde indexscan met extra operators voor de volledige tekstovereenkomst en een merge-join.
Antwoord 3, autoriteit 4%
Ik denk dat CONTAINS
langer duurde en Merge
gebruikte omdat je een streepje (“-“) had in je zoekopdracht adventure-works.com
.
Het DASH is een pauze-woord, zodat de CONTAINS
doorzocht de volledige tekstindex voor adventure
en dan doorzocht naar works.com
en fuseerde de resultaten.
Antwoord 4, Autoriteit 3%
Probeer hier ook van te veranderen:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Hieraan:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
De eerste vindt records met waarden zoals “Dit is een test ” en “een testcase is het plan “.
Dit laatste vindt ook records met waarden zoals “Ik test dit ” en “Dit is de grootste “.