Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Volltextkatalog und automatische Vervollständigung

Mein erster Kommentar:Ich nehme an, der vollständige Name des Computers ist etwas Ähnliches wie Vorname + ' ' + Nachname -- können Sie den Vornamen wie "Carl%" und den Nachnamen wie "Gari%" eingeben war dazu gedacht, Informationen zu sammeln. Danke für die Beantwortung.

Ich habe dies nicht selbst ausprobiert (und es spielt nur in Ihrer Umgebung eine Rolle), aber Sie könnten die like-Klauseln zu der Contains-basierten Abfrage hinzufügen und die Abfragepläne mit der Contains-Version vergleichen.

Es gibt 3 mögliche Abfragen offensichtliche Abfragen

A Contains version -- your existing query
A Like Version -- as I commented
A Combined version -- using like and contains

Ich glaube nicht, dass Sie unbedingt Recht haben, wenn Sie sagen, dass die Vollindexsuche immer schneller ist als die LIKE-Version, denn ich denke, die richtige Antwort ist, es kommt darauf an.

Wenn Sie Indizes für den Nachnamen (oder auch den Vornamen) haben, sollte die „Gefällt mir“-Version eine indizierte Suche durchführen. Dies hängt von Ihrer Schlüsselverteilung und dem Übereinstimmungsprozentsatz ab. Das heißt, die Suche nach Nachnamen wie „G%“ und Vornamen wie „Carl%“ als „Gari%“ und „Carl%“ wäre viel langsamer, wenn nur der Nachname indexiert würde. Wenn Sie also über ausreichend lange Suchschlüssel verfügen, ist die LIKE-Version wahrscheinlich schneller als die Contains-Version. Sie müssen testen, um sicher zu wissen, was am besten funktioniert.

Es kann sein, dass die kombinierte Version immer die beste Wahl oder zumindest gut genug ist. Aber ich würde dies auf jeden Fall zuerst versuchen, bevor ich der folgenden Strategie folge.

Die Gesamtstrategie, die ich vorschlagen würde, ist:

Hören Sie auf, die inkrementelle Suche zu verwenden, bis der Benutzer mindestens ein paar Zeichen eingegeben hat – Sie zahlen wahrscheinlich einen Großteil der Leistungseinbußen dafür, da dies für die Benutzer Ihrer Website fast keinen wirklichen Wert hat. Als Vorschlag, führen Sie keine inkrementelle Suche durch, bevor sie mindestens 3 Zeichen eingegeben haben. Da Sie nicht erwähnt haben, dass Sie bereits vor der inkrementellen Suche mindestens Zeichen benötigen.

Wenn dies abgelehnt wird, dieselbe grundlegende Strategie, aber Sie rufen die inkrementelle Suche nicht auf, bis NN Millisekunden seit dem letzten eingegebenen Zeichen vergangen sind oder eine Anzahl von Zeichen> eine gewisse Länge eingegeben wurde. Da einige Nachnamen nur aus 2 Zeichen bestehen, müssen Sie diese Strategie in der Realität so ziemlich anwenden.

Ebenso würde ich überhaupt keine inkrementelle Suche durchführen, unabhängig von der Länge, solange der Benutzer schnell neue Zeichen eingibt, um verschwendete Suchen zu vermeiden, die der Benutzer nicht verwendet.

Sofern die kombinierte Abfrage nicht immer gut genug ist, sollten Sie zwei verschiedene gespeicherte Prozesse auf Ihrem Server haben, um Suchergebnisse zurückzugeben, wobei eine die ähnliche Version und die andere die enthält-Version ist. Rufen Sie die Version auf, die voraussichtlich die besten Ergebnisse liefert, je nachdem, wie viel des Namens angegeben wurde.