2010-12-22 14 views
1

Ich spiele ein wenig mit Volltextindizes in Sql Server 2008. Ich erstellte den Index, Katalog und füllen Sie es voll. Meine Tabelle hat fast 400.000 Datensätze. Mein Volltextindex ist in einer varchar (Max) -Spalte definiert (nennen wir es jetzt Text). Ich führe die folgende Abfrage aus:SQL Server 2008 FullText Optimierung

Wählen * aus MyTable wo enthält (Text, 'Haus').

Diese Abfrage gibt in 14 Sekunden fast 20.000 Datensätze zurück. Ich denke das ist sehr langsam. Aber, wenn ich diese Abfrage ausführen:

select Count (*) von MyTable wo enthält (Text, 'Haus')

Es dauert nur 1 Sekunde, um das Ergebnis zu zeigen.

Ich habe gesucht und soweit ich sehen kann, ist der Ausführungsplan der gleiche für beide Abfragen. Warum braucht Sql Server so viel, um das erste Abfrageergebnis anzuzeigen?

Was habe ich schon getan:

kaufte ich eine SSD und sowohl MDF- und LDF auf dieser Platte setzen. Aber wenn ich die erste Abfrage ausführe, kann ich sehen, dass Protokolle und eine tmp-Datenbank auf meiner Festplatte erstellt werden (nicht in der SSD). Meine SSD ist D: und alle temporären Dateien werden bei C: erstellt.

Ist das so lang, weil sql diese Dateien benötigt, um das Enterprise Manager-Ergebnisraster zu füllen? Was kann ich tun, um die Datenbank zu optimieren? Ich brauche die Abfragen wirklich in weniger als 2 Sekunden.

+0

Wird alles auf einer einzelnen Maschine ausgeführt oder übertragen Sie Daten über ein Netzwerk? –

+0

Noch eine Frage: Diese 14 Sekunden-Zahl, ist das die Zeit, die benötigt wird, um die Ergebnismenge an Ihr SSMS-Fenster zu senden, oder die Zeit, die es braucht, um Werte zu zeigen? –

+0

Es ist die Zeit, die es dauert, bis der Ergebnissatz an mein SSMS zurückgegeben wird. –

Antwort

2

Müssen Sie wirklich den gesamten Text anzeigen, oder möchten Sie weitere Abfragen zu den Ergebnissen durchführen und sie weiter eingrenzen? Ich nehme an, dass die meisten der 14 Sekunden an Anzeige die Ergebnisse verwendet werden - wenn Sie sie nicht zeigen müssen oder nur eine Teilmenge dieser Ergebnisse anzeigen möchten, sollte die Ausführungszeit sinken.

1

Gibt es einen Grund, warum Sie 20.000 Datensätze zurückgeben müssen? Können Sie der Abfrage einen Seitenwechsel hinzufügen, sodass Sie die Ergebnismenge in Blöcken von 20, 100, 1000 oder etwas kleiner als 20.000 zurückgeben? Es wird Zeit brauchen, um ein Ergebnis zu liefern, das groß ist, egal wie viel Sie optimieren.

+0

Ich denke, ich kann Stücke von 1000 verwenden. –

+0

Ich versuchte eine Auswahl Top 1000, aber es dauerte 4 Sekunden ... es ist immer noch sehr langsam. –

+0

1000 Datensätze ist immer noch eine Menge abhängig von den Daten in den Tabellen. Nehmen wir an, jede Zeile enthält 1000 Zeichen Text. Das sind etwa 1 Kilobyte Text pro Zeile. 1000 Zeilen wären nur für die Spalte 1 MB. Ich habe keine Ahnung, wie Ihre Daten aussehen, aber das könnte es sein. Werden diese Daten Benutzern in einem Grid angezeigt? Wenn dies der Fall ist, ist es sinnvoll, die Ergebnisse auf 20 pro Seite zu beschränken ... aber ich weiß nicht, was Ihr spezifisches Szenario ist, so dass es nicht angemessen ist. – Dismissile

1

Die zusätzliche Zeit Ihrer Abfrage wird wahrscheinlich durch das Ausfüllen des Rasters in Management Studio verursacht.

Denken Sie daran, dass wenn Sie einen SELECT * ausführen, Sie auch die Textspalte selbst in die Rasterergebnisse einschließen. Versuchen Sie, nur andere Spalten als Ihre Textspalte auszuwählen, und Sie werden wahrscheinlich feststellen, dass die Ausführungszeit näher an der Ihrer SELECT COUNT (*) -Abfrage liegt. Vielleicht möchten Sie auch DATALENGTH (Text) in Ihre Auswahlliste aufnehmen.

Es gibt auch eine Option in Management Studio, die die maximal im Raster abgerufenen Zeichen steuert. Sie finden es unter Extras -> Optionen -> Abfrageergebnisse -> Ergebnisse in Gitter.

0

Ich stimme Christian zu. Dein Problem ist mit der Wiedergabe des Ergebnisses. Versuchen Sie die Ausgabe in Text anstatt in Grid, um einen Teil dieses Aufwands zu vermeiden.

+0

Sie wissen, dass die Frage mehr als 4 Jahre alt ist, oder? – Plutonix