Was macht OPTION FAST in der SELECT-Anweisung?


29

Ich habe ein wenig darüber nachgedacht, was der OPTION (FAST XXX)Abfragehinweis in einer SELECTAnweisung bewirkt , und bin immer noch verwirrt. Laut MSDN:

Gibt an, dass die Abfrage für den schnellen Abruf der ersten number_rows optimiert ist. Dies ist eine nicht negative ganze Zahl. Nachdem die ersten number_rows zurückgegeben wurden, setzt die Abfrage die Ausführung fort und erzeugt die vollständige Ergebnismenge.

Für mich macht das nicht viel Sinn, aber im Grunde kann die Abfrage die ersten XXX Zeilen wirklich schnell bekommen, dann den Rest mit normaler Geschwindigkeit?

Die Microsoft Dynamics-Abfrage, bei der ich darüber nachdachte, lautet:

select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid
from pjproj WITH (NOLOCK)
where project like  '%'
order by project OPTION(FAST 500)

Kann jemand genau erklären, was dieser Abfragehinweis tut und welchen Vorteil er hat, wenn er nicht verwendet wird?

Antworten:


24

A FAST Nweist SQL Server an, einen Ausführungsplan zu erstellen, in dem die Anzahl der als definierten Zeilen schnell zurückgegeben wird N.

Beachten Sie, dass die Schätzungen dem entsprechen, Nda Sie SQL Server anweisen, NZeilen so schnell wie möglich abzurufen .

zB läuft unter abfrage mit fast 500:

-- total rows : 19972
 SELECT [BusinessEntityID]
      ,[TotalPurchaseYTD]
      ,[DateFirstPurchase]
      ,[BirthDate]
      ,[MaritalStatus]
      ,[YearlyIncome]
      ,[Gender]
      ,[TotalChildren]
      ,[NumberChildrenAtHome]
      ,[Education]
      ,[Occupation]
      ,[HomeOwnerFlag]
      ,[NumberCarsOwned]
  FROM [AdventureWorks2012].[Sales].[vPersonDemographics]
  order by BusinessEntityID
  option (fast 500)

Est vs Tatsächliche Zeilen mit option (fast 500)

Bildbeschreibung hier eingeben

Est vs Aktuelle Zeilen ohne option (fast 500)

Bildbeschreibung hier eingeben

Ein Anwendungsfall wäre, wenn eine Anwendung Caching ausführt (große Datenmengen in den Hintergrund laden) und dem Benutzer so schnell wie möglich einen Datenausschnitt anzeigen möchte.

Ein weiterer interessanter Anwendungsfall ist in SSIS Land , dass Rob Farley beschreibt die Verwendung FAST Nals Katalysator , um die Datenwiederherstellung zu beschleunigen.

Durch das Hinzufügen dieses Hinweises kam es mir so vor, als wäre ein Zauberstab über die Abfrage geschwenkt worden, um sie um ein Vielfaches schneller laufen zu lassen.

Siehe auch Remus Rusanus Antwort .


11

Wenn Sie diesen Abfragehinweis OPTION (FAST n) verwenden, wählt das Optimierungsprogramm einen Ausführungsplan aus, der diese Anzahl von Datensätzen auf schnellstmögliche Weise zurückgeben kann. Normalerweise versucht das Optimierungsprogramm, einen Pfad festzulegen, über den das gesamte Resultset effizient zurückgegeben werden kann. Wenn Sie also möchten, dass eine Reihe von Zeilen schnell wieder angezeigt wird, können Sie diese möglicherweise verwenden, um sie abzurufen. In den meisten Fällen führt die Verwendung dieses Hinweises jedoch dazu, dass die gesamte Ergebnismenge langsamer wieder angezeigt wird, als wenn das Optimierungsprogramm einen Plan verwendet so.

Nur um einen Anwendungsfall zu erläutern: Möglicherweise müssen Sie zwei relativ große Tabellen zusammenfügen, aber Sie wissen, dass nur ein kleinerer Datensatz erforderlich ist, mit dem Sie aus einem dieser Tabellen arbeiten können. In diesem Fall kann es hilfreich sein, FAST über eine größere Tabelle zu verwenden, ohne zusätzliche Indizes / Overheads erstellen zu müssen, anstatt SQL eine riesige Hash-Tabelle im Hintergrund erstellen zu lassen.


2

Vor einigen Jahren bin ich bei der Untersuchung von Leistungsproblemen in Dynamics AX auf dieselbe Frage gestoßen. Nach der Erklärung von Microsoft konnte ich einen anderen Ausführungsplan sehen, der durch den Hinweis ausgelöst wurde, und dies entspricht den anderen hier gegebenen Antworten.

Mit dem Hinweis versucht SQL Server, einen Ausführungsplan zu finden, der eine Art Streaming von Ergebnissen ermöglicht, da diese beispielsweise aus einer verschachtelten Schleife stammen, anstatt eines Ausführungsplans, bei dem alle Datensätze zuvor gelesen (und möglicherweise sortiert) werden müssen ausgegeben wird.

Das einzige Problem in meinem Fall ist, dass SQL Server immer (zahlreiche) Minuten brauchte, um die Ergebnisse bei Verwendung des Hinweises zurückzugeben, während die Abfrage Ergebnisse (die gesamte Ergebnismenge) innerhalb von Sekunden ohne den Hinweis zurückgab ... nicht ganz was war erwartet. Ich würde diesen Hinweis persönlich mit großer Vorsicht verwenden und nicht systematisch auf allen Formularen wie in unserer Dynamics-Umgebung (nun, nicht mehr).

Zur Beantwortung des OP: Wie bei vielen Hinweisen ist es nicht unbedingt hilfreich, die Abfrage so zu verbessern, wie sie sein soll (also ... test, test, test!)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.