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:
Vergleich mit dem SQL Query Plan Explorer: 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.
sql-server
query-performance
execution-plan
Evaldas Buinauskas
quelle
quelle
Antworten:
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.
quelle