Frage zur Leistung von 'SELECT TOP'


18

Ich habe eine Abfrage, die mit select viel schneller top 100und ohne select viel langsamer läuft top 100. Die Anzahl der zurückgegebenen Datensätze ist 0. Können Sie den Unterschied in den Abfrageplänen erklären oder Verknüpfungen freigeben, wenn ein solcher Unterschied erklärt wurde?

Die Abfrage ohne topText:

SELECT --TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

Der Abfrageplan für die oben genannten (ohne top):

https://pastebin.com/cbtJpxFf

Bildbeschreibung hier eingeben

Die IO- und TIME-Statistiken (ohne top):

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'INVENTDIM'. Scan count 0, logical reads 988297, physical reads 0, read-ahead reads 1, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 1, logical reads 1234560, physical reads 0, read-ahead reads 14299, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 6256 ms,  elapsed time = 13348 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

Die verwendeten Indizes (ohne top):

1. INVENTTRANS.I_177TRANSIDIDX
   4 KEYS:
 - DATAAREAID
 - INVENTTRANSID
 - INVENTDIMID
 - RECID
2. INVENTTRANS.I_177ITEMIDX
   3 KEYS:
   - DATAAREAID
   - ITEMID
   - DATEPHYSICAL 
3. INVENTDIM.I_698DIMIDIDX
   2 KEYS:
   - DATAAREAID
   - INVENTDIMID

Die Abfrage mit top:

SELECT TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

Der Abfrageplan (mit TOP):

https://pastebin.com/0dyu6QZd

Bildbeschreibung hier eingeben


Die Abfrage IO und TIME Statistik (mit TOP):

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 15385, logical reads 82542, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTDIM'. Scan count 1, logical reads 62704, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 265 ms,  elapsed time = 257 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

Die verwendeten Indizes (mit TOP):

 1. INVENTTRANS.I_177TRANSIDIDX
     4 KEYS:
     - DATAAREAID
     - INVENTTRANSID
     - INVENTDIMID
     - RECID
 2. INVENTTRANS.I_177DIMIDIDX
    3 KEYS:
    - DATAAREAID
    - INVENTDIMID
    - ITEMID
 3. INVENTDIM.I_698DIMIDIDX
    2 KEYS:
    - DATAAREAID
    - INVENTDIMID
 4. INVENTDIM.I_698ECC_BUSUNITLOCIDX
    3 KEYS
    - DATAAREAID
    - ECC_BUSINESSUNITID
    - INVENTLOCATIONID

Würde mich über jede Hilfe zu diesem Thema sehr freuen!


2
Ich denke nicht, dass die Geschwindigkeit von 'TOP' ohne 'ORDER BY' von Bedeutung ist. Richtige Ergebnisse sind wichtiger als Geschwindigkeit.
Dan Guzman

Antworten:


15

SQL Server erstellt verschiedene Ausführungspläne für TOP 100 unter Verwendung eines anderen Sortieralgorithmus. Manchmal ist es schneller, manchmal ist es langsamer.

Für einfachere Beispiele lesen Sie Wie viel kann eine Zeile einen Abfrageplan ändern? Teil 1 und Teil 2 .

Ausführliche technische Details sowie ein Beispiel dafür, wo der TOP 100-Algorithmus tatsächlich langsamer ist, finden Sie in Paul Whites Sortierung, Zeilenziele und dem TOP 100-Problem .

Fazit: Wenn Sie in Ihrem Fall wissen, dass keine Zeilen zurückgegeben werden, führen Sie die Abfrage nicht aus, oder? Die schnellste Abfrage ist die, die Sie niemals durchführen. Wenn Sie jedoch eine Existenzprüfung durchführen müssen, führen Sie nur IF EXISTS (hier Stick-Abfrage) aus, und dann führt SQL Server einen noch anderen Ausführungsplan aus.


Danke, ich werde es auf jeden Fall lesen. Ich habe auch festgestellt, dass die Zeilenschätzungen in beiden Szenarien falsch sind. Womit könnte es verbunden sein? Die Statistiken sind in Ordnung - ich habe sie mit der Fullscan-Option für beide Clustered-Indizes aktualisiert.
George K

Auch - ist es in meinem Fall geeignet, da ich keine BESTELLUNG habe, also glaube ich, dass keine SORT in meinem Plan sein wird?
George K

Es wird sehr interessant sein zu sehen, ob der Ausführungsplan sowohl für TOP 100 als auch für TOP 101 gleich ist. Wenn es möglich ist, teilen Sie ihn bitte mit. Vielen Dank.
Artashes Khachatryan

@GeorgeK Ich kann sehen, dass Sie Dynamics AX verwenden. Achten Sie auf die Ablaufverfolgungsfahne [ blogs.msdn.microsoft.com/axinthefield/…, die zu zahlreichen Problemen mit Schätzungen führen kann. Wenn das Ablaufverfolgungsflag 4136 deaktiviert ist, prüfen Sie, ob die Spalte "Partition" die erste in Ihren Indizes ist. Partition hat normalerweise nur sehr wenige unterschiedliche Werte.
Hans Vader

9

Wenn Sie sich die beiden Pläne ansehen, haben Sie eine wichtige Übersicht über beide Pläne mit dramatisch unterschiedlichen prozentualen Kosten. Wenn Sie mit der Maus über die Objekte fahren, sehen Sie die Anzahl der Ausführungen.

Die Schlüsselsuche ist ein Rückblick auf den Clustered-Index, da der Index, der in der Indexsuche (oben rechts) verwendet wird, nicht alle Spalten abdeckt (wählen Sie * aus, sodass der Clustered-Index verwendet werden muss).

Top 100 kann die 100 Zeilen, die in weniger Lesevorgängen benötigt werden, aus dem Index abrufen und die Suche dann 100 Mal durchführen, anstatt für jede Zeile in der Tabelle. Erklärt auch die Zunahme der Anzahl der gelesenen Seiten, wenn NICHT "oben" getan wird.

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.