我在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。
我认为我对第二个估算值的理解是不正确的,不同的数字似乎表明了这一点。我想念什么?