Sto eseguendo questa query nel database 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
Se guardo il piano di esecuzione stimato, vedo quanto segue:
La ricerca dell'indice iniziale (in alto a destra) sta utilizzando l'indice IX_SalesOrderHeader_CustomerID e la ricerca nel letterale 11077. Ha una stima di 2.6192 righe.
Se uso DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM
, mostra che il valore 11077 è compreso tra le due chiavi campionate 11019 e 11091.
Il numero medio di righe distinte tra 11019 e 11091 è 2.619718 o arrotondato a 2.61972 che è il valore delle righe stimate visualizzate per la ricerca dell'indice.
La parte che non capisco è il numero stimato di righe per la ricerca dell'indice cluster rispetto alla tabella SalesOrderDetail.
Se corro DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID')
:
Quindi la densità di SalesOrderID (a cui mi sto unendo) è 3.178134E-05. Ciò significa che 1 / 3.178134E-05 (31465) è uguale al numero di valori SalesOrderID univoci nella tabella SalesOrderDetail.
Se ci sono 31465 SalesIDderID univoci in SalesOrderDetail, quindi con una distribuzione uniforme, il numero medio di righe per SalesOrderID è 121317 (numero totale di righe) diviso per 31465. La media è 3.85561
Quindi, se il numero stimato di righe da ripetere è 2.61972 e la media da restituire in 3.85561, penso che il numero stimato di righe sarebbe 2.61972 * 3.85561 = 10.10062.
Ma il numero stimato di righe è 11.4867.
Penso che la mia comprensione della seconda stima sia errata e i numeri diversi sembrano indicarlo. Cosa mi sto perdendo?