Frage

Wir haben eine ganze Reihe von Abfragen, die „Suche“ für Kunden, Kunden, usw. Sie nach Vornamen suchen, E-Mail usw. Wir sind wie Aussagen in der folgenden Weise mit:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

Ist die Volltextindizierung Hilfe im Szenario? Wir verwenden SQL Server 2005.

War es hilfreich?

Lösung

Es hängt von Ihrem DBMS abhängen. Ich glaube, dass die meisten Systeme werden nicht die Vorteile des Volltextindex nehmen, wenn Sie die Volltext-Funktionen verwenden. (ZB MATCH / gegen in mySQL oder FREETEXT- / ENTHÄLT in MS SQL)

Hier ist ein guter Artikel, wann, warum und wie die Volltextindizierung in SQL Server verwenden: Verstehen SQL Server Volltextindizierung

Andere Tipps

FTS kann Hilfe in diesem Szenario die Frage, ob es das wert ist oder nicht.

mit beginnen, schauen wir uns an, warum LIKE die effektivste Suche nicht sein. Wenn Sie LIKE verwenden, besonders wenn man mit einem % am Anfang Ihrer Vergleich suchen, muss SQL Server sowohl einen Table-Scan jeder einzelnen Zeile auszuführen und ein Byte für Byte Überprüfung der Spalte, die Sie prüft wird.

FTS hat einige bessere Algorithmen zum Datenabgleich wie einige bessere Statistiken über Variationen von Namen tut. Daher kann FTS bessere Leistung zum Abgleichen Smith, Smythe, Smithers, etc, wenn Sie für Smith suchen.

Es ist jedoch etwas komplexer FTS zu verwenden, wie Sie CONTAINS vs FREETEXT und dem obskuren Format der Suche zu meistern brauchen. Wenn Sie jedoch eine Suche in dem entweder FName oder LName Spiel machen wollen, können Sie das tun, mit einer Anweisung anstelle eines ODER.

Um festzustellen, ob FTS wird wirksam sein, festzustellen, wie viele Daten Sie haben. Ich benutze FTS auf einer Datenbank von mehreren hundert Millionen Zeilen und das ist ein echter Vorteil gegenüber mit LIKE suchen, aber ich es nicht auf jedem Tisch verwenden.

Wenn Sie Ihre Tabellengröße ist vernünftiger, weniger als ein paar Millionen, können Sie ähnliche Geschwindigkeit erhalten, indem Sie einen Index für jede Spalte erstellen, die Sie gehen zu suchen auf und SQL Server sollte einen Index-Scan statt einer Tabelle durchführen scannen.

Nach meinem Testszenario:

  • SQL Server 2008
  • 10.000.000 Zeilen mit je einem String wie „WortA WortB wordC ...“(variiert zwischen 1 und 30 Wörter)
  • Auswahl count (*) mit ENTHÄLT (Spalte "WortB")
  • Ergebnisgröße mehr hunderttausend
  • Kataloggröße ca. 1,8 GB

Volltextindex war im Bereich von 2s während like '% WortB% war in Bereich von 1-2 Minuten.

Aber das gilt nur, wenn Sie weitere Selektionskriterien nicht! Z. B. wenn ich einige verwendet „wie‚Präfix%‘“ auf einer Primärschlüsselspalte zusätzlich war die Leistung schlechter, da der Betrieb des Gehens in den Volltextindex mehr als tun eine String-Suche in einigen Bereichen Kosten (so lange die sind nicht zu viel).

So würde ich Volltextindex empfehlen nur in Fällen, in denen Sie eine „freie String-Suche“ zu tun oder einige der Besonderheiten es verwendet ...

Um die Frage speziell für MSSQL, Volltextindizierung wird nicht Hilfe in Ihrem Szenario zu beantworten.

Um die Abfrage zu verbessern Sie eine der folgenden Möglichkeiten tun konnte:

  1. Konfigurieren Sie einen Volltextkatalog auf der Spalte und verwenden Sie die contains () Funktion.
  2. Wenn Sie in erster Linie mit einem Präfix gesucht wurden (das heißt von Anfang des Namens entspricht), könnten Sie das Prädikat wie folgt ändern und einen Index über die Spalte erstellen.

    Dabei gilt fname wie 'prefix%

(1) ist wahrscheinlich übertrieben für das, es sei denn, die Leistung der Abfrage ist ein großes Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top