SQL Server, TOP versus ROW_NUMBER

8

Ich lerne etwas über Ausführungspläne und probiere verschiedene Abfragen aus und vergleiche deren Leistung. Dabei bin ich auf Folgendes gestoßen:

SELECT StatisticID
FROM (
    SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn
    FROM FTCatalog.Statistic
    ) AS T
WHERE T.rn <= 1000
ORDER BY rn

SELECT TOP 1000 StatisticID
FROM FTCatalog.Statistic
ORDER BY StatisticID

Beide geben dieselbe Ergebnismenge zurück - die erste wird jedoch schneller ausgeführt und ist weniger ressourcenhungrig (zumindest SSMS sagt mir das). Hier sind Ausführungspläne: Ausführungspläne

Vergleich mit dem SQL Query Plan Explorer: Geben Sie hier die Bildbeschreibung ein Kann mir jemand einen Einblick geben, was tatsächlich hinter den Kulissen passiert und warum die Ergebnisse unterschiedlich sind? Wenn Sie noch etwas brauchen, lassen Sie es mich einfach wissen.

Danke, Evaldas.

Evaldas Buinauskas
quelle
Aus irgendeinem Grund verfügt SQL Server nicht über gute Umschreibungen für Paging-Abfragen. Diese Unterschiede in Plan und Schätzung sollten für einen solchen häufigen Fall nicht bestehen.
usr

Antworten:

11

Ich denke, Sie vergleichen die geschätzten Kosten für die Abfragen. Dies sind nur Schätzungen, die (unter anderem) auf der geschätzten Anzahl der von der Abfrage zurückgegebenen Zeilen basieren. Nicht die tatsächliche Anzahl der Zeilen.

Ihre erste Abfrage hat geschätzt, dass 30 Zeilen zurückgegeben werden, und Ihre zweite Abfrage hat 1000 Zeilen geschätzt. Hier kommt Ihr Unterschied in den Abfragekosten her.

Wenn Sie die Abfragen so ändern, dass nur 30 Zeilen abgerufen werden, werden Sie feststellen, dass die geschätzten Zeilen für die Abfragen gleich sind und die erste Abfrage tatsächlich etwas höher ist, zumindest für mich in SQL Server 2014.

Verwenden Sie die Schätzungen nicht, wenn Sie die Leistung von Abfragen vergleichen. Verwenden Sie stattdessen Dinge wie Dauer, Anzahl der Lesevorgänge und Größe der Speicherzuweisungen.

Mikael Eriksson
quelle
1
Führen Sie jede der Abfragen mehrmals (GO 10) mit der Option Client-Statistik einschließen aus, um die tatsächliche Leistung zu ermitteln. Ich vermute, Sie werden feststellen, dass die tatsächlichen Ausführungszeiten näher als die relativen Kostenschätzungen liegen. Es gibt keine Magie unter der Decke; Die Operatoren des Abfrageplans erzählen die wahre Geschichte.
Dan Guzman
Bedeuten relative Kosten (prozentualer Ausdruck) tatsächlich etwas in SSMS? Das nervte mich am meisten.
Evaldas Buinauskas
@EvaldasBuinauskas Nicht sicher, ob die relativen Kosten für irgendetwas nützlich sind. Vielleicht manchmal, aber ich glaube nicht, dass dies jemals die Verwirrung wert sein könnte, die entsteht, wenn Leute anfangen, den geschätzten Prozentsatz zu verwenden, um die Leistung verschiedener Abfragen zu vergleichen. Es wird immer eine Schätzung sein und Schätzungen sind immer (fast) falsch.
Mikael Eriksson
@EvaldasBuinauskas, diese Kosten werden während des Optimierungsprozesses gesammelt und offengelegt, sind jedoch nicht als Indikator oder tatsächliche Laufzeit gedacht. Die Kosten sind nur eine gute Vermutung. Siehe blogs.msdn.com/b/sqlqueryprocessing/archive/2006/10/11/…
Dan Guzman