Welche der folgenden Abfragen ist schneller (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
oder
SELECT * FROM table WHERE Contains(Column, "test");
Welche der folgenden Abfragen ist schneller (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
oder
SELECT * FROM table WHERE Contains(Column, "test");
Antworten:
Die zweite (vorausgesetzt, Sie meinen CONTAINS
, und tatsächlich in eine gültige Abfrage einfügen) sollte schneller sein, da sie eine Art Index verwenden kann (in diesem Fall einen Volltextindex). Diese Form der Abfrage ist natürlich nur verfügbar, wenn sich die Spalte in einem Volltextindex befindet. Ist dies nicht der Fall, ist nur das erste Formular verfügbar.
Die erste Abfrage, die LIKE verwendet, kann keinen Index verwenden, da sie mit einem Platzhalter beginnt und daher immer einen vollständigen Tabellenscan erfordert.
Die CONTAINS
Abfrage sollte lauten:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? Was davon? Die ursprüngliche Form der Frage hatte, Column CONTAIN("%test%",Column)>0
die nirgends annähernd gültig war. Es ist immer noch nicht ganz richtig.
Nachdem ich beide Abfragen auf einer SQL Server 2012-Instanz ausgeführt habe, kann ich bestätigen, dass die erste Abfrage in meinem Fall am schnellsten war.
Die Abfrage mit dem LIKE
Schlüsselwort zeigte einen Clustered-Index-Scan.
Das CONTAINS
hatte auch einen Clustered-Index-Scan mit zusätzlichen Operatoren für die Volltextübereinstimmung und einen Merge-Join.
LIKE
Abfrage mit einem führenden Platzhalter kann den Indexteil nicht effizient verwenden. Es muss nur das Ganze gescannt werden. Obwohl es zweifellos einige Umstände gibt, unter denen der vollständige CI-Scan eine bessere Leistung erbringt als eine Abfrage unter Verwendung des Volltextindex (möglicherweise, wenn beispielsweise ein sehr hoher Anteil der Zeilen übereinstimmt), ist dies größtenteils die Ausnahme, die Sie nicht bestätigen können ".
LIKE
.
Ich denke, CONTAINS
das hat länger gedauert und verwendet, Merge
weil Sie einen Bindestrich ("-") in Ihrer Abfrage hatten adventure-works.com
.
Der Bindestrich ist ein Unterbrechungswort, daher wurde im CONTAINS
Volltextindex adventure
nach works.com
den Ergebnissen gesucht und danach gesucht und die Ergebnisse zusammengeführt.
Versuchen Sie auch, dies zu ändern:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Dazu:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
Ersteres findet Datensätze mit Werten wie " Dies ist ein Test " und " Ein Testfall ist der Plan ".
Letztere finden auch Datensätze mit Werten wie " Ich teste dies " und " Dies ist das Größte ".
CONTAINS
werden nur Präfixbegriffe wie "test *", keine Suffixbegriffe wie " test" und keine vollständige Teilstringsuche wie "* test " erwähnt. Ich habe es jedoch nicht versucht.