对于示例数据...
/*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 不使用总体计划成本作为临界点,那么实际逻辑是什么?