'SELECT TOP' performans sorusu


18

Ben çok daha hızlı seçin top 100ve olmadan çok daha yavaş çalışan bir sorgu var top 100. Döndürülen kayıt sayısı 0'dır. Sorgu planlarındaki farkı açıklayabilir veya bu farkın açıklandığı bağlantıları paylaşır mısınız?

topMetin içermeyen sorgu :

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 = 'Казахстан';

Yukarıdakiler için sorgu planı (olmadan top):

https://pastebin.com/cbtJpxFf

resim açıklamasını buraya girin

IO ve TIME istatistikleri (olmadan 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.

Kullanılan dizinler (olmadan 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

Şununla sorgu 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 = 'Казахстан';

Sorgu planı (TOP ile):

https://pastebin.com/0dyu6QZd

resim açıklamasını buraya girin


Sorgu IO ve TIME istatistikleri (TOP ile):

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.

Kullanılan indeksler (TOP ile):

 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

Konuyla ilgili herhangi bir yardımı derinden takdir edecektir!


2
'ORDER BY' olmadan 'TOP' hızının önemli olduğunu düşünmüyorum. Doğru sonuçlar hızdan daha önemlidir.
Dan Guzman

Yanıtlar:


15

SQL Server, TOP 100 için farklı bir sıralama algoritması kullanarak farklı yürütme planları oluşturur. Bazen daha hızlı, bazen daha yavaş.

Daha basit örnekleri için Bir Satır Sorgu Planını Ne Kadar Değiştirebilir? Başlıklı konuyu okuyun. Bölüm 1 ve Bölüm 2 .

Ayrıntılı teknik ayrıntılar ve ayrıca TOP 100 algoritmasının gerçekten daha yavaş olduğu bir örnek için Paul White'ın Sıralama, Satır Hedefleri ve TOP 100 Sorunu'nu okuyun .

Alt satır: sizin durumunuzda, hiçbir satır döndürülmeyeceğini biliyorsanız, iyi ... sorguyu çalıştırma, ha? En hızlı sorgu hiç yapmadığınız sorudur. Ancak, bir varlık denetimi yapmanız gerekiyorsa, IF EXISTS (burada sorgu sorgusu) yapın ve SQL Server daha farklı bir yürütme planı yapar.


Teşekkürler, kesinlikle okuyacağım. Ayrıca her iki senaryoda da satır tahminlerinin yanlış olduğunu fark ettim. Ne ile bağlantılı olabilir? İstatistikler iyi ise - her iki kümelenmiş dizinde fullscan seçeneği ile güncelledim.
George K

Ayrıca - herhangi bir SİPARİŞ yok gibi benim durumumda uygundur, bu yüzden planımda hiçbir SORT olmayacak inanıyorum?
George K

İcra planının hem TOP 100 hem de TOP 101 için aynı olup olmadığını görmek çok ilginç olacak. Mümkünse lütfen paylaşın. Teşekkürler.
Artashes Khachatryan

@GeorgeK Dynamics AX kullandığınızı görebiliyorum. Pek çok tahmin sorununa yol açabilecek izleme bayrağı [ blogs.msdn.microsoft.com/axinthefield/… adresine dikkat edin . İzleme bayrağı 4136 devre dışı bırakılırsa, dizinlerinizde ilk "Bölüm" Sütunu olup olmadığını kontrol edin. Bölüm genellikle çok az farklı değere sahiptir.
Hans Vader

9

İki plana baktığınızda, her ikisi de önemli ölçüde farklı% maliyetlerle anahtar aramaya sahipsiniz. Fareyi nesnelerin üzerine getirirseniz, yürütme sayısını görürsünüz.

Dizin aramasında kullanılan dizin (sağ üstte) tüm sütunları kapsamadığından, anahtar arama, kümelenmiş dizine geri yapılan bir aramadır (bu nedenle kümelenmiş dizin kullanılmalıdır).

En iyi 100, dizinden daha az okumada gereken 100 satırı alabilir ve ardından tablodaki her satır yerine 100 kez aramayı gerçekleştirebilir. Ayrıca 'üst' YAPILMADIĞINDA okunan sayfa sayısındaki artışı açıklar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.