与完整扫描相比,50% 的采样率更新统计数据所需的时间要长得多

Dol*_*ley 1 sql-server statistics sql-server-2012

我们有一个针对大型表的本地更新统计作业,它基本上发出 UPDATE STATS 命令。从历史上看,我们一直默认使用 FULL SCAN,但最近我们切换到 SAMPLE 50 PERCENT。奇怪的是,update stats 命令的运行时间要高得多。

举个例子,我们有表 1,它有 6 个统计信息(3 个索引,3 个自动生成)。聚集索引为 1.2 TB;NCI 1 为 2.7 GB;NCI 2 为 2.6 GB

1 个月前使用 FULL SCAN 更新了表上的统计信息,该命令耗时 96 分钟。昨晚更新了统计数据,SAMPLE 50 PERCENT,命令耗时 593 分钟!两次运行之间的表行数大致相同。

我可以从 sys.dm_db_stats_properties 看到聚集索引只占用了 4 分钟的时间。我的问题是,为什么将采样率降低 50% 会导致命令运行时间延长近 5 倍?

命令运行时没有发生任何阻塞(根据 SQL Sentry),也没有任何资源瓶颈(CPU < 40%,IO 延迟 < 10 by-in-large)。

我想知道的一件事是并行性是否在起作用 - 使用完整扫描,SQL 可以使用并行性,但使用示例 % 它是单线程的吗?

我们正在运行 SQL 2012 SP2 CU7

Kri*_*yer 6

当您运行 stat updates 时WITH FULLSCAN,它会并行运行。我相信它自 SQL 2005 以来一直存在。

来自 TechNet:

“全扫描的并行统计信息收集:对于使用全扫描收集的统计信息,可以为非分区表和分区表并行创建单个统计对象。”

来源:https : //technet.microsoft.com/en-us/library/cc966419.aspx

当您不使用FULLSCAN引擎时,请利用TABLESAMPLE作为并行抑制器的选项。在 SQL 2016 中,抽样统计更新也可以并行进行。

资料来源:平行统计更新