2009-08-20 9 views
4

Ich las über die Dokumentation für die Suche nach Hinweisen: http://msdn.microsoft.com/en-us/library/ms181714(SQL.90).aspxSoll ich Abfrage-Tipp Fast Number_rows/FASTFIRSTROW verwenden?

Und bemerkte dies: FAST number_rows Gibt an, dass die Abfrage für ein schnelles Abrufen der ersten number_rows optimiert ist. Dies ist eine nicht negative ganze Zahl. Nachdem die ersten Zahl_Zeilen zurückgegeben wurden, setzt die Abfrage die Ausführung fort und erzeugt ihre vollständige Ergebnismenge.

Also, wenn ich mache eine Abfrage wie:

Select Name from Students where ID = 444 

Soll ich mit einem Hauch wie diese Mühe machen? Angenommen, SQL Server 2005, wann sollte ich?

- bearbeiten -

Auch sollte man sich die Mühe, wenn die Ergebnisse zu begrenzen:

Select top 10 * from Students OPTION (FAST 10) 

Antwort

1

Bei der Verwendung von TOP x, gibt es keinen Vorteil auch OPTION FAST x verwenden. Der Abfrageoptimierer trifft seine Entscheidungen bereits basierend auf der Anzahl der Zeilen, die Sie abrufen. Gleiches gilt für triviale Abfragen, z. B. die Abfrage eines bestimmten Werts aus einem eindeutigen Index.

Other than that, OPTION FAST x könnte helfen, wenn Sie die Anzahl der Ergebnisse wissen wahrscheinlich unter x, aber der Abfrageoptimierer nicht. Wenn der Abfrageoptimierer schlechte Pfade für komplexe Abfragen mit wenigen Ergebnissen auswählt, müssen Ihre Statistiken möglicherweise aktualisiert werden. Und wenn Sie falsch auf x schätzen, kann die Abfrage am Ende dauert länger dauern - fast immer ein Risiko, wenn Hinweise geben.

Die obige Anweisung wurde nicht getestet - es kann sein, dass alle Abfragen genauso lange dauern, um vollständig auszuführen, wenn nicht länger. Die ersten 10 Zeilen schnell zu bekommen ist großartig, wenn es nur 8 Zeilen gibt, aber theoretisch muss die Abfrage noch vollständig ausgeführt werden, bevor sie beendet wird. Der Vorteil, den ich denke, kann da sein, da die Abfrage Ausführung einen anderen Pfad erwartet weniger insgesamt Datensätze, wenn in der Tat es wirklich versucht, die erste x schneller zu bekommen. Diese beiden Arten von Optimierungen sind möglicherweise nicht ausgerichtet.

1

Für diese bestimmte Abfrage, schon gar nicht! Es wird nur eine Zeile zurückgegeben - die Zeile mit ID = 444. SQL Server wird diese Zeile so effizient wie möglich auswählen.

FAST 10 könnte in einer Situation verwendet werden, in der Sie die ersten 10 Zeilen sofort verwenden können, auch wenn Sie weiterhin auf weitere Ergebnisse warten.

16

Der FAST-Hinweis ist nur bei komplexen Abfragen sinnvoll, bei denen der Optimierer mehrere Alternativen auswählen kann. Für eine einfache Abfrage wie Ihr Beispiel hilft es bei nichts, der Abfrageoptimierer wird sofort feststellen, dass es einen trivialen Plan gibt (Suche im ID-Index, Nachschlage-Name, falls nicht abgedeckt), um die Abfrage zu erfüllen und danach zu suchen. Auch wenn kein Index für ID vorhanden ist, ist der Plan immer noch trivial (wahrscheinlich Cluster-Scan).

Um ein Beispiel zu geben, wo FAST nützlich wäre, betrachten Sie eine Verbindung zwischen A und B mit einer ORDER BY-Einschränkung. Nehmen wir an, dass die Bewertung der Verknüpfung B zuerst und die verschachtelten Schleifen A die Bedingung ORDER BY respektieren, so dass schnelle Ergebnisse erzeugt werden (keine SORT notwendig), aber wegen der Kardinalität teurer ist (B hat viele Datensätze, die WHERE entsprechen, während A wenige hat). Auf der anderen Seite würde die Auswertung von B zuerst und verschachtelte Schleife A eine Abfrage erzeugen, die weniger IO ist daher insgesamt schneller, aber das Ergebnis müsste zuerst sortiert werden und SORT kann nur starten, nachdem der Join ausgewertet wird, so das erste Ergebnis wird sehr spät kommen. Der Optimierer würde normalerweise den zweiten Plan wählen, da er insgesamt effizienter ist. Der FAST-Hinweis würde dazu führen, dass der Optimierer den ersten Plan auswählt, da er schneller Ergebnisse liefert.