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 CONTAINSAbfrage sollte lauten:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS? Was davon? Die ursprüngliche Form der Frage hatte, Column CONTAIN("%test%",Column)>0die 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 LIKESchlüsselwort zeigte einen Clustered-Index-Scan.
Das CONTAINShatte auch einen Clustered-Index-Scan mit zusätzlichen Operatoren für die Volltextübereinstimmung und einen Merge-Join.

LIKEAbfrage 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, CONTAINSdas hat länger gedauert und verwendet, Mergeweil Sie einen Bindestrich ("-") in Ihrer Abfrage hatten adventure-works.com.
Der Bindestrich ist ein Unterbrechungswort, daher wurde im CONTAINSVolltextindex adventurenach works.comden 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 ".
CONTAINSwerden nur Präfixbegriffe wie "test *", keine Suffixbegriffe wie " test" und keine vollständige Teilstringsuche wie "* test " erwähnt. Ich habe es jedoch nicht versucht.