我正在阅读 Iztik Ben-Gan 的《T-SQL 查询》一书。 我很难理解为什么减少过滤器的限制会使优化器从并行计划转向串行计划。
第一个查询适用于并行计划,但第二个查询适用于串行计划。
SELECT [orderid], [custid], [empid], [shipperid], [orderdate], [filler]
FROm dbo.Orders
WHERE orderid <=30000
SELECT [orderid], [custid], [empid], [shipperid], [orderdate], [filler]
FROm dbo.Orders
WHERE orderid <=490000
两个查询都使用此索引进行聚集索引扫描:
CREATE CLUSTERED INDEX [idx_cl_od] ON [dbo].[Orders]
(
[orderdate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
该表有 1000000 行,orderid 均匀分布。
有谁知道原因吗?
高行数的并行计划。
串行执行计划只是聚簇索引扫描。
并行执行计划将是并行运行的聚集索引扫描和收集流运算符。
收集流运算符的运算符成本取决于估计需要处理的行数。
串行与并行计划中聚集索引扫描的估计成本将按预期 DOP 缩减其 CPU 成本,而 IO 成本保持不变。
这样做的结果是,将会出现一个临界点,串行计划的成本会更便宜。
例如,如果在
DOP 1
时,扫描操作符的估计 I/O 成本为 50
,估计的 CPU 成本为 10
,则总体操作符成本为 60
。
对于估计可用 DOP 为 4 的并行计划,运营商成本将为
52.5
(50 + (10/4)
)
因此,只要在此示例中收集流运算符的成本为
<= 7.5
,并行计划的成本就会更便宜。谓词的选择性越强,该运算符的估计成本就越低。
您可以使用
OPTION (MAXDOP 1)
强制执行串行计划,并使用 OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))
获得并行计划以查看执行计划并比较不同估计选择性下的成本。