Ich habe eine Abfrage, die mit select viel schneller top 100
und 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 top
Text:
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
):
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):
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!
Antworten:
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.
quelle
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.
quelle