Ich hätte gedacht, dass, wenn eine Abfrage TOP n enthält, das Datenbankmodul die Abfrage ausführen würde, wobei die TOP-Klausel ignoriert würde, und dann am Ende das Ergebnis auf die Anzahl n der angeforderten Zeilen verkleinern würde. Der grafische Ausführungsplan scheint darauf hinzuweisen, dass dies der Fall ist - TOP ist der "letzte" Schritt. Aber es scheint, dass mehr los ist.
Die Art und Weise, wie das oben Gesagte formuliert ist, lässt mich denken, dass Sie möglicherweise ein falsches Bild davon haben, wie eine Abfrage ausgeführt wird. Ein Operator in einem Abfrageplan ist kein Schritt (bei dem die vollständige Ergebnismenge eines vorherigen Schritts von der nächsten ausgewertet wird).
SQL Server verwendet ein Pipeline- Ausführungsmodell, bei dem jeder Operator Methoden wie Init () , GetRow () und Close () verfügbar macht . Wie der Name GetRow () andeutet, erstellt ein Operator bei Bedarf jeweils eine Zeile (wie vom übergeordneten Operator gefordert). Dies ist in der Online-Dokumentation für logische und physische Operatoren dokumentiert. Weitere Informationen finden Sie in meinem Blog-Beitrag Warum Abfragepläne rückwärts ausgeführt werden . Dieses zeilenweise Modell ist für die Erstellung einer fundierten Intuition für die Ausführung von Abfragen von entscheidender Bedeutung.
Meine Frage ist, wie (und warum) sich eine TOP
n-Klausel auf den Ausführungsplan einer Abfrage auswirkt.
Einige logische Operationen wie TOP
Semi-Joins und der FAST n
Abfragehinweis wirken sich auf die Art und Weise aus, wie das Abfrageoptimierungsprogramm Ausführungsplanalternativen kostet. Die Grundidee ist, dass eine mögliche Planform die ersten n Zeilen schneller zurückgibt als ein anderer Plan, der für die Rückgabe aller Zeilen optimiert wurde.
Beispielsweise ist der Join mit indizierten verschachtelten Schleifen häufig der schnellste Weg, um eine kleine Anzahl von Zeilen zurückzugeben, obwohl der Hash- oder Merge-Join mit Scans bei größeren Mengen möglicherweise effizienter ist. Das Abfrageoptimierungsprogramm ermittelt diese Auswahlmöglichkeiten, indem es ein Zeilenziel an einem bestimmten Punkt in der logischen Betriebsstruktur festlegt.
Ein Zeilenziel ändert die Art und Weise, in der Alternativen für Abfragepläne berechnet werden. Das Wesentliche dabei ist, dass das Optimierungsprogramm zunächst jeden Operator so kalkuliert, als ob die gesamte Ergebnismenge erforderlich wäre, ein Zeilenziel an der entsprechenden Stelle festlegt und dann den Planbaum zurücksetzt, um die Anzahl der zu untersuchenden Zeilen zu schätzen um das Reihenziel zu erreichen.
Beispielsweise setzt eine Logik TOP(10)
an einem bestimmten Punkt in der logischen Abfragestruktur ein Zeilenziel von 10. Die Kosten der Operatoren, die zum Zeilenziel führen, werden geändert, um abzuschätzen, wie viele Zeilen sie produzieren müssen, um das Zeilenziel zu erreichen. Diese Berechnung kann komplex werden, daher ist es einfacher, all dies anhand eines vollständig ausgearbeiteten Beispiels und kommentierter Ausführungspläne zu verstehen . Zeilenziele können mehr beeinflussen als die Auswahl des Verknüpfungstyps oder ob Suchvorgänge und Suchvorgänge gegenüber Scans bevorzugt werden. Mehr dazu hier .
Wie immer unterliegt ein auf der Grundlage eines Zeilenziels ausgewählter Ausführungsplan den Argumentationsfähigkeiten des Optimierers und der Qualität der ihm bereitgestellten Informationen. Nicht jeder Plan mit einem Zeilenziel wird in der Praxis die erforderliche Anzahl von Zeilen schneller produzieren, sondern gemäß dem Kalkulationsmodell.
Wenn sich herausstellt, dass ein Zeilenzielplan nicht schneller ist, gibt es normalerweise Möglichkeiten, die Abfrage zu ändern oder dem Optimierer bessere Informationen bereitzustellen, sodass der natürlich ausgewählte Plan am besten ist. Welche Option in Ihrem Fall angemessen ist, hängt natürlich von den Details ab. Das Zeilenziel-Feature ist im Allgemeinen sehr effektiv (obwohl es einen Fehler gibt, auf den Sie achten müssen, wenn Sie es in parallelen Ausführungsplänen verwenden).
Ihre spezielle Anfrage und Ihr Plan sind möglicherweise nicht für eine detaillierte Analyse geeignet (stellen Sie auf jeden Fall einen tatsächlichen Ausführungsplan zur Verfügung, wenn Sie dies wünschen), aber hoffentlich können Sie mit den hier beschriebenen Ideen Fortschritte erzielen.
ORDER BY
Klausel. Hinzufügen vonTOP
Änderungen, wo im Plan diese Art auftritt, aber ich bin mehr besorgt darüber, wie sich dies auf die Anzahl der Ausführungen von Index-Suchvorgängen in Tabelle B auswirkt ... (natürlich können die beiden verwandt sein - ich weiß nicht)