2 Stimmen

Alternativen zu MS SQL 2005 Volltextkatalog

Ich kann scheinbar keine akzeptable Leistung von FullText Catalogs erhalten. Wir haben Situationen, in denen wir 100k+ Abfragen so schnell wie möglich ausführen müssen. Einige der Abfragen verwenden FREETEXT, andere nicht. Hier ist ein Beispiel für eine Abfrage

IF EXISTS(select 1 from user_data d where d.userid=@userid and FREETEXT(*, @activities) SET @match=1

Dies kann zwischen 3-15 Sekunden dauern. Ich brauche es viel schneller sein < 1s, wenn möglich.

Mir gefällt die "Flexibilität" der Volltextabfrage, da sie über mehrere Spalten hinweg suchen kann und die Syntax recht intuitiv ist. Ich würde lieber keine Like-Anweisung verwenden, weil wir in der Lage sein wollen, Wörter wie "Writer" und "Writing" zu finden.

Ich habe einige der hier aufgeführten Vorschläge ausprobiert http://msdn.microsoft.com/en-us/library/ms142560(SQL.90).aspx

Wir haben so viel Arbeitsspeicher und CPU, wie wir uns leisten können, aber leider können wir die Kataloge nicht auf eigene Festplattencontroller legen.

Ich bin ratlos und bereit, andere Alternativen zu Volltextabfragen zu suchen. Gibt es irgendetwas anderes da draußen, das diese Art von "Writer"/"Writing" ähnliche Treffer liefert? Vielleicht sogar etwas, das die CLR verwendet?

2voto

Brent Ozar Punkte 13049

Schauen Sie sich diese Alternativen an, obwohl ich bezweifle, dass sie die Leistung verbessern, ohne sie auf separater Hardware zu isolieren:

Welche Suchtechnologie soll mit ASP.NET verwendet werden?

Lucene.Net und SQL Server

0voto

Frans Bouma Punkte 8141

Aufgrund der Natur von FREETEXT ist die Leistung geringer als bei der Verwendung von CONTAINS, da weniger präzise Alternativen für die angegebenen Schlüsselwörter berücksichtigt werden müssen. CONTAINS kann Writing finden, wenn Sie Write angeben btw, ich bin nicht sicher, ob Sie überprüft haben, ob CONTAINS den Trick macht oder nicht.

Vermeiden Sie außerdem IF-Anweisungen in SQL, da sie oft zu einer vollständigen Neukompilierung des Ausführungsplans für jede Abfrage führen, was wahrscheinlich zu der schlechten Leistung beiträgt, die Sie beobachten. Ich bin mir nicht sicher, wie die IF-Anweisung verwendet wird, da sie wahrscheinlich in einem größeren Teil von SQL enthalten ist. Versuchen Sie, die EXISTS-Abfrage mit dem größeren Teil der SQL-Anweisung zu verbinden, da Sie den @match-Parameter in der SELECT-Anweisung innerhalb der EXISTS-Anweisung setzen können, oder lassen Sie die Variable ganz weg und verwenden Sie die EXISTS-Klausel als Prädikat in der größeren Abfrage.

SQL ist eine mengenorientierte und interpretierte Sprache. Daher ist es oft schneller, auf imperative Programmierkonstrukte zu verzichten und stattdessen die nativen Set-Operatoren von SQL zu verwenden.

0voto

Tim Mahy Punkte 1329

Vielleicht https://github.com/MahyTim/LuceneNetSqlDirectory kann Ihnen helfen, einen LuceneNET-Index in SQLServer zu speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X