it-swarm.com.de

LIKE vs CONTAINS auf SQL Server

Welche der folgenden Abfragen ist schneller (LIKE vs CONTAINS)?

SELECT * FROM table WHERE Column LIKE '%test%';

oder

SELECT * FROM table WHERE Contains(Column, "test");
183
user667429

Die zweite (vorausgesetzt, Sie meinen CONTAINS und setzen sie tatsächlich in eine gültige Abfrage) sollte schneller sein, da sie some als Indexform verwenden kann (in diesem Fall eine vollständige Textindex). Natürlich ist diese Form der Abfrage nur verfügbar if Die Spalte befindet sich in einem Volltextindex. Ist dies nicht der Fall, ist nur das erste Formular verfügbar.

Bei der ersten Abfrage mit LIKE kann kein Index verwendet werden, da dieser mit einem Platzhalter beginnt. Daher ist immer ein vollständiger Tabellenscan erforderlich.


Die CONTAINS Abfrage sollte sein:

SELECT * FROM table WHERE CONTAINS(Column, 'test');
152

ENTHÄLT Sucht nach präzisen oder unscharfen (weniger präzisen) Übereinstimmungen mit einzelnen Wörtern und Phrasen, Wörtern in einem bestimmten Abstand voneinander oder nach gewichteten Übereinstimmungen in SQL Server.

CONTAINS kann suchen nach:

  1. Ein Wort oder eine Phrase.
  2. Das Präfix eines Wortes oder einer Phrase.
  3. Ein Wort in der Nähe eines anderen Wortes.
  4. Ein Wort, das von einem anderen Wort biegsam erzeugt wird (z. B. ist das Wortlaufwerk der biegsame Stamm von Antrieben, Antrieben, Antreiben und Antreiben).
  5. Ein Wort, das ein Synonym für ein anderes Wort ist, das einen Thesaurus verwendet (das Wort "Metall" kann beispielsweise Synonyme wie "Aluminium" und "Stahl" enthalten).

Hinweis: CONTAINS ist schneller und funktioniert, wenn der Volltextindex aktualisiert wird. Wenn Sie eine exakte Übereinstimmung mit regulären Ausdrücken wünschen, können Sie like verwenden.

23
Somnath Muluk

Nachdem ich beide Abfragen auf einer SQL Server 2012-Instanz ausgeführt habe, kann ich bestätigen, dass die erste Abfrage in meinem Fall die schnellste war.

Die Abfrage mit dem Schlüsselwort LIKE ergab einen Clustered-Index-Scan.

Die CONTAINS hatte auch einen Clustered-Index-Scan mit zusätzlichen Operatoren für die Volltextübereinstimmung und einen Merge-Join.

Plan

13
MI C

Versuchen Sie auch, dies zu ändern:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

Dazu:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

Ersterer findet Datensätze mit Werten wie "dies ist ein Test" und "ein Testfall ist der Plan".

Letzterer findet auch Datensätze mit Werten wie "ich teste dies" und "das ist das größte".

5
John Doe

Ich denke, dass CONTAINS länger gedauert hat und Merge verwendet hat, weil Ihre Abfrage adventure-works.com einen Bindestrich ("-") enthielt.

Der Bindestrich ist ein Unterbrechungswort, daher hat CONTAINS den Volltextindex nach adventure durchsucht und anschließend nach works.com gesucht und die Ergebnisse zusammengeführt.

5
Omri Valfer