TSQL Warum ist Top mit einer Variablen schneller?

10

Guten Morgen alle,

Ich habe an einem mäßig komplexen SQL gearbeitet, um einige Daten aus einer Produktdatenbank eines Drittanbieters zu erhalten und sie in unseren eigenen internen Anwendungen anzuzeigen.

Ich habe eine Auswahl hinzugefügt, um den Top-Datensatz aus einer Tabelle in einer Unterabfrage zu erhalten (wenn dies sinnvoll ist).

Die Abfrage dauerte fast 3 Minuten, um eine endgültige Ergebnismenge von 100 Datensätzen mit zurückzugeben

SELECT TOP 1 ...

Ich habe online nach Verbesserungen für das gesucht, was ich erreichen wollte, und es wurde vorgeschlagen, meine Auswahl zu ändern, um eine Variable zu verwenden, wie unten

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

Dies dauerte die gleiche Abfrage von 3 Minuten bis 1 Sekunde, was großartig ist!

Aber kann jemand erklären, warum das so ist.

JamesStuddart
quelle

Antworten:

14

Wenn Sie dies tun, erstellt top 1das Abfrageoptimierungsprogramm einen Plan, mit dem 1 Zeile so schnell wie möglich abgerufen werden kann.

Wenn Sie eine lokale Variable verwenden, ist der Wert der Variablen dem Optimierer unbekannt. Stattdessen wird ein Plan erstellt, der so optimiert ist, dass 100 Zeilen so schnell wie möglich abgerufen werden.

In Ihrem Fall ist der mit einem Zeilenziel von 100 generierte Abfrageplan der bessere Plan, selbst wenn Sie nur eine Zeile möchten.

Um dies zu überprüfen, können Sie versuchen option (recompile), Ihre Abfrage mit der Variablen zu ergänzen . In diesem Fall verwendet SQL Server den aktuellen Wert von @topCountals Zeilenziel. Da dies 1 ist, sollten Sie den langsamen Plan erhalten.

Mikael Eriksson
quelle
Ich verstehe den Unterschied im Plan, aber es wundert mich, dass das Abrufen einer Zeile langsamer sein kann als das Abrufen von 100 Zeilen. Ich würde denken, wenn der 100-Zeilen-Plan am besten funktioniert, würde SQL Server denselben Plan für verwenden top 1.
Brandon
@Brandon ruft nicht 100 Zeilen ab, sondern erstellt den Ausführungsplan nur unter der Annahme, dass 100 Zeilen gewünscht werden. Die Ausführung wird beendet, wenn 1 Zeile gefunden wurde.
Mikael Eriksson
Zu überprüfen, was in diesen Fällen mit dem Ausführungsplan anders ist, würde wahrscheinlich helfen, das Problem mit Top 1 zu verstehen.
James Z