对于示例数据...
/*Quick and dirty generation of some rows of data*/
SELECT value as [orderid],
1 as [custid],
1 as [empid],
1 as [shipperid],
getdate() as [orderdate],
'abcdefgh' as [filler]
INTO dbo.Orders
FROM generate_series(1,10000000)
CREATE CLUSTERED INDEX [idx_cl_od] ON [dbo].[Orders]
(
[orderdate] ASC
)
UPDATE STATISTICS dbo.Orders WITH FULLSCAN
以及以下查询
SELECT [orderid], [custid], [empid], [shipperid], [orderdate], [filler]
FROM dbo.Orders
WHERE orderid <=7601715 AND 1=1 /*Prevent simple parameterisation*/
然后在我的开发机器(SQL Server 2022,DOP 为 4)上,聚集索引扫描的 IO 成本46.8853
与串行或并行计划无关。扫描的 CPU 成本11.0002
在串行计划和 2.75004
并行计划中,因此我预计计划之间的临界点是并行运算符超出时8.25016
(估计进入的行数约为 450 万时达到的阈值)。实际上,在实际发生这种情况时,收集流运算符的成本是13.0501
(比我预期的高出约 300 万行)。
如果 SQL Server 不使用总体计划成本作为临界点,那么实际逻辑是什么?
临界点正如您所期望的那样。显示计划信息并未准确反映优化器成本。
前两个查询(并行自然和串行提示)在优化器输出时的成本均为62.6855。
Showplan 显示串行计划的费用为57.8855 (少 4.8)。
串行计划的优化器输出在 Scan 上方有一个 Filter。此 Filter 被优化后重写作为残差(非 SARG)谓词下推到 Scan 中。重写会损失 Filter 的成本。
您可以使用跟踪标志 9130 查看扩展计划(无下推):
该过滤器的成本为 4.8。