我正在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
如果我查看估计的执行计划,我会看到以下内容: 初始的索引搜索(右上方)使用了IX_SalesOrderHeader_CustomerID索引,并在字面值11077上进行搜索。它估计有2.6192行。 如果我使用
DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM
,它会显示值11077位于两个样本键11019和11091之间。
在11019和11091之间的不同行的平均数量为2.619718,或者四舍五入为2.61972,这是索引搜索显示的估计行数的值。我不理解的部分是针对SalesOrderDetail表的聚集索引搜索的估计行数。 如果我运行
DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID')
:
所以我要连接的SalesOrderID的密度是3.178134E-05。这意味着1/3.178134E-05(31465)等于SalesOrderDetail表中唯一的SalesOrderID值的数量。如果SalesOrderDetail中有31465个唯一的SalesOrderID,那么在均匀分布的情况下,每个SalesOrderID的平均行数是121317(总行数)除以31465。平均值为3.85561。
所以如果要循环遍历的估计行数是2.61972,并且平均返回值为3.85561,那么我认为估计行数应该是2.61972 * 3.85561 = 10.10062。
但是估计行数是11.4867。
我觉得我对第二个估计的理解是错误的,而且不同的数字似乎表明了这一点。我错过了什么?