LIKE vs CONTAINS op SQL Server

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 CONTAINSbedoelt, 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 LIKEtoonde een geclusterde indexscan.

De CONTAINShad ook een geclusterde indexscan met extra operators voor de volledige tekstovereenkomst en een merge-join.


Antwoord 3, autoriteit 4%

Ik denk dat CONTAINSlanger duurde en Mergegebruikte omdat je een streepje (“-“) had in je zoekopdracht adventure-works.com.

Het DASH is een pauze-woord, zodat de CONTAINSdoorzocht de volledige tekstindex voor adventureen dan doorzocht naar works.comen 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 “.

Other episodes