Estou executando esta consulta no banco de dados 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 eu olhar o plano de execução estimado, vejo o seguinte:
A busca inicial do índice (canto superior direito) está usando o índice IX_SalesOrderHeader_CustomerID e pesquisando no literal 11077. Ele tem uma estimativa de 2.6192 linhas.
Se eu usar DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM
, mostra que o valor 11077 está entre as duas chaves amostradas 11019 e 11091.
O número médio de linhas distintas entre 11019 e 11091 é 2.619718 ou arredondado para 2.61972, que é o valor das linhas estimadas mostradas para a busca do índice.
A parte que eu não entendo é o número estimado de linhas para a busca de índice em cluster na tabela SalesOrderDetail.
Se eu correr DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID')
:
Portanto, a densidade do SalesOrderID (no qual estou ingressando) é 3.178134E-05. Isso significa que 1 / 3.178134E-05 (31465) é igual ao número de valores únicos de SalesOrderID na tabela SalesOrderDetail.
Se houver 31465 SalesOrderID exclusivos no SalesOrderDetail, com uma distribuição uniforme, o número médio de linhas por SalesOrderID será 121317 (número total de linhas) dividido por 31465. A média é 3,85561
Portanto, se o número estimado de linhas a serem repetidas for 2.61972 e a média a ser retornada em 3.85561, eu pensaria que o número estimado de linhas seria 2.61972 * 3.85561 = 10.10062.
Mas o número estimado de linhas é 11.4867.
Eu acho que meu entendimento da segunda estimativa está incorreto e os números diferentes parecem indicar isso. o que estou perdendo?