Saya menjalankan kueri ini di basis data AdventureWorks2012 :
SELECT
s.SalesOrderID,
d.CarrierTrackingNumber,
d.ProductID,
d.OrderQty
FROM Sales.SalesOrderHeader s
JOIN Sales.SalesOrderDetail d
ON s.SalesOrderID = d.SalesOrderID
WHERE s.CustomerID = 11077
Jika saya melihat perkiraan rencana eksekusi, saya melihat yang berikut:
Pencarian indeks awal (kanan atas) menggunakan indeks IX_SalesOrderHeader_CustomerID dan mencari pada literal 11077. Ia memiliki perkiraan 2,6192 baris.
Jika saya menggunakan DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM
, ini menunjukkan bahwa nilai 11077 adalah antara dua kunci sampel 11019 dan 11091.
Jumlah rata-rata baris berbeda antara 11019 dan 11091 adalah 2,619718, atau dibulatkan menjadi 2,61972 yang merupakan nilai estimasi baris yang ditampilkan untuk pencarian indeks.
Bagian yang saya tidak mengerti adalah perkiraan jumlah baris untuk pencarian indeks berkerumun terhadap tabel SalesOrderDetail.
Jika saya menjalankan DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID')
:
Jadi kepadatan SalesOrderID (yang saya gabungkan) adalah 3.178134E-05. Itu berarti 1 / 3.178134E-05 (31465) sama dengan jumlah nilai unik SalesOrderID dalam tabel SalesOrderDetail.
Jika ada 31465 SalesOrderID unik dalam SalesOrderDetail, maka dengan distribusi genap, jumlah rata-rata baris per SalesOrderID adalah 121317 (total jumlah baris) dibagi dengan 31465. Rata-rata adalah 3,85561
Jadi, jika perkiraan jumlah baris yang akan dilewati adalah 2,61972, dan rata-rata yang akan dikembalikan pada 3,85561, saya akan berpikir perkiraan jumlah baris akan menjadi 2,61972 * 3,85561 = 10,10062.
Namun perkiraan jumlah baris adalah 11,4867.
Saya pikir pemahaman saya tentang estimasi kedua tidak benar dan angka yang berbeda tampaknya menunjukkan hal itu. Apa yang saya lewatkan?