Answers:
从SQL Server 2005开始,并行统计信息已可用。TechNet文章“ Microsoft SQL Server 2005中的查询优化器使用的统计信息”中记录了该更新:
在执行全面扫描(无论是否明确请求)的情况下,为数据收集而生成的内部查询具有以下一般形式:
SELECT
StatMan([SC0])
FROM
(
SELECT TOP 100 PERCENT
[Column] AS [SC0]
FROM [Table] WITH (READUNCOMMITTED)
ORDER BY [SC0]
) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 16)
注意MAXDOP
那里的提示(尽管用户无法手动指定提示)。在收集抽样统计信息的地方,内部查询使用该TABLESAMPLE
子句,该子句可防止并行性。引擎还会MAXDOP 1
在内部查询上生成提示,这有点多余。
如果您需要减少并行度,则MAXDOP
可以使用资源调控器(仅限企业版)覆盖内部查询中的提示。
SQL Server 2016 添加了并行采样统计信息更新。
从SQL Server 2016 SP2开始,您可以使用MAXDOP
option。
更新为CREATE STATISTICS和UPDATE STATISTICS语句增加了对MAXDOP选项的支持:
此更新为Microsoft SQL Server 2016和2017中的CREATE STATISTICS和UPDATE STATISTICS语句增加了对MAXDOP选项的支持。这使您可以覆盖在数据库或服务器级别指定的最大并行度(MAXDOP)的默认设置。
注意:如果使用了资源调控器,则结果并行度由工作负载组MAX_DOP设置限制。
例如,假设使用了Sales.SalesOrderDetail表,并且已经在其上创建了一些统计信息。在这种情况下,以下脚本以等于8的并行度更新每个统计信息。
UPDATE STATISTICS Sales.SalesOrderDetail WITH MAXDOP = 8
UPDATE STATISTICS没有任何内部并行性。无论是使用FULLSCAN还是SAMPLING运行都没有关系。当然,您可以一次运行多个UPDATE STATISTICS命令,每个命令可以通过多个SQL Agent作业或其他一些便利在不同的连接上运行。根据您使用硬件和数据的实际情况,您可能会发现,仅对表重新索引要比使用FULLSCAN进行UPDATE STATISTICS更快,并且可能是更好的选择。