2009-07-23 20 views
16

Was genau ist der Unterschied (und Vor-/Nachteile) zwischen einem Volltextindex und einem regulären Index für eine varchar-Spalte? Wann würde ich welchen Index verwenden?SQL Server: Normaler Index vs. Volltextindex

Ich habe eine Vielzahl von Varchar-Spalten (Adressen - Stadtname, Straßenname usw.), die ich in der performantesten Weise durchsuchbar sein muss und ich versuche herauszufinden, welcher Indextyp verwendet werden soll und warum.

Vielen Dank!

Antwort

19

Es hängt von der Art der Suche ab, die Sie tun möchten. Zum Beispiel können Sie nicht einen normalen Index mit dieser Abfrage verwenden:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE '%' + @SearchText + '%' 

Es ist nicht sargable. Dies ist sargable, aber die selectivity vielleicht nicht sehr gut sein:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE @SearchText + '%' 

Sie verwenden einen Volltextindex ganz anders:

SELECT * FROM [MyTable] WHERE CONTAINS([MyColumn], @SearchText) 
+0

Gibt es einen Grund, nicht einen Volltextindex dann verwenden? – Alex

+0

Sie benötigen viel Speicherplatz und werden nur langsam neu berechnet. –

+1

Die Sargable Erwähnung ist genial - ich fühle, dass das nicht genug gelehrt wird. – AndrewPK

8

Normalerweise, wenn mit einem normalen Index suchen, können Sie nur suchen in einem einzigen Feld, z "Finde alle Städte, die mit A beginnen" oder so ähnlich.

Volltextindex ermöglicht die Suche über mehrere Spalten, z. Suchen Sie sofort auf der Straße, in der Stadt, in der Provinz, etc. Das könnte ein Vorteil sein, wenn Sie etwas wie eine Suche im Google-Stil tun möchten - einfach einen Suchbegriff eingeben und alle Zeilen finden, die diesen Suchbegriff irgendwo in einem der Suchbegriffe enthalten Varchar-Spalten.

Zusätzlich mit einer normalen Suche, Sie sind ziemlich begrenzt, was Sie tun können - Sie nach einer genauen Übereinstimmung suchen oder gerade wie - das ist es.

mit Volltext-Index können Sie für Wortformen (RAN, laufen, etc.) und auch nach ähnlichen Wörtern suchen, indem Sie Ihren eigenen Thesaurus angeben. Sie können nach mehreren Sprachen suchen, wenn das ein Problem ist. Sie können nach Einträgen suchen, die zwei oder mehr Begriffe enthalten, die einander "NEAR" entsprechen.

Marc

+1

+1, um die praktischen Gründe zu nennen, warum ein FULLTEXT-Index erstellt werden sollte, statt nur über Syntax und kompatible Operationen zu kommentieren. – dayuloli

3

Vom MSDN:

Im Gegensatz zur Volltextsuche, das LIKE Transact-SQL-Prädikat funktioniert auf Zeichenmuster nur. Außerdem können Sie das LIKE-Prädikat nicht verwenden, um formatierte Binärdaten abzufragen. Darüber hinaus ist eine LIKE-Abfrage für eine große Menge unstrukturierter Textdaten wesentlich langsamer als eine entsprechende Volltextabfrage für dieselben Daten.

Eine LIKE-Abfrage gegen Millionen von Zeilen Textdaten kann Minuten dauern, um zurückzukehren; während eine Volltextabfrage abhängig von der Anzahl der zurückgegebenen Zeilen nur wenige Sekunden oder weniger für dieselben Daten benötigt.