J'exécute cette requête dans la base de données 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
Si je regarde le plan d'exécution estimé, je vois ce qui suit:
La recherche d'index initiale (en haut à droite) utilise l'index IX_SalesOrderHeader_CustomerID et effectue une recherche sur le littéral 11077. Elle a une estimation de 2,6192 lignes.
Si j'utilise DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM
, cela montre que la valeur 11077 se situe entre les deux clés échantillonnées 11019 et 11091.
Le nombre moyen de lignes distinctes entre 11019 et 11091 est de 2,619718, ou arrondi à 2,61972, qui est la valeur des lignes estimées indiquées pour la recherche d'index.
La partie que je ne comprends pas est le nombre estimé de lignes pour la recherche d'index cluster par rapport à la table SalesOrderDetail.
Si je cours DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID')
:
La densité de SalesOrderID (sur laquelle je me joins) est donc de 3.178134E-05. Cela signifie que 1 / 3.178134E-05 (31465) est égal au nombre de valeurs SalesOrderID uniques dans la table SalesOrderDetail.
S'il y a 31465 SalesOrderID uniques dans SalesOrderDetail, alors avec une distribution paire, le nombre moyen de lignes par SalesOrderID est 121317 (nombre total de lignes) divisé par 31465. La moyenne est de 3 85561.
Donc, si le nombre estimé de lignes à parcourir est de 2,61972, et la moyenne à renvoyer dans 3.85561, le je pense que le nombre estimé de lignes serait 2.61972 * 3.85561 = 10.10062.
Mais le nombre estimé de lignes est de 11,4867.
Je pense que ma compréhension de la deuxième estimation est incorrecte et les chiffres différents semblent l'indiquer. Qu'est-ce que je rate?