Korzystam z tego zapytania w bazie danych 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
Jeśli spojrzę na szacowany plan wykonania, zobaczę:
Początkowe wyszukiwanie indeksu (prawy górny róg) korzysta z indeksu IX_SalesOrderHeader_CustomerID i przeszukuje dosłownie 11077. Szacuje się, że 2,6192 wierszy.
Jeśli DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM
użyję, pokazuje, że wartość 11077 jest między dwoma próbkowanymi kluczami 11019 i 11091.
Średnia liczba różnych wierszy między 11019 a 11091 wynosi 2,619718 lub zaokrąglona do 2,61972, co jest wartością szacowanych wierszy pokazanych dla wyszukiwania indeksu.
Część, której nie rozumiem, to szacunkowa liczba wierszy dla wyszukiwania klastrowanego indeksu względem tabeli SalesOrderDetail.
Jeśli uruchomię DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID')
:
Zatem gęstość SalesOrderID (do której dołączam) wynosi 3.178134E-05. Oznacza to, że 1 / 3.178134E-05 (31465) jest równy liczbie unikalnych wartości SalesOrderID w tabeli SalesOrderDetail.
Jeśli w SalesOrderDetail znajduje się 31465 unikalnych identyfikatorów SalesOrderID, wówczas przy równomiernym rozkładzie średnia liczba wierszy przypadająca na SalesOrderID wynosi 121317 (całkowita liczba wierszy) podzielona przez 31465. Średnia wynosi 3,85561
Więc jeśli szacowana liczba wierszy do przejścia przez pętlę wynosi 2,61972, a średnia do zwrotu w 3,85561, pomyślałbym, że szacowana liczba wierszy wyniosłaby 2,61972 * 3,85561 = 10,10062.
Ale szacunkowa liczba wierszy wynosi 11,4867.
Myślę, że moje rozumienie drugiego oszacowania jest nieprawidłowe i wydaje się, że różne liczby wskazują na to. czego mi brakuje?