在 SQL Server 2014 上使用完整扫描更新统计信息使用 100% cpu,在 2008 R2 上为 15%

TRH*_*ANS 10 sql-server sql-server-2008-r2 sql-server-2014

为什么完全扫描更新统计信息在 SQL Server 2014 上使用 100% 的 CPU,而在 SQL Server 2008 R2 上使用可能 20% 的 CPU,对于相同的表,具有相似的硬件功能?

我一直在寻找MAXDOP其他选项,但真的看不出有什么特别之处。我意识到可能存在可能导致这种情况的设置,但两个数据库的设置非常相似(例如,两个数据库的设置都MAXDOP为 4,两者都有多个内核)。两者都是企业版。

SQL Server 2014 与 SQL Server 2008 R2 中是否有“不同”之处可以解释这一点?我有两个服务器的 90% 内存选项。关于寻找什么的任何想法?

我使用 SQL Server 2008 R2/SP3 和 SQL Server 2014/SP2 在两台服务器上每周运行一次完整 (100%) 扫描的更新统计信息,并且数据库具有相同的结构。在 2008 R2 服务器上,两个非常大的表的更新统计需要几个小时,这是我所期望的,但 CPU 的利用率一直保持在 20% 左右。但是,在 2014 年服务器上,CPU 在大约 40 分钟内达到 100%。2014 服务器上的表要小一些。我通过使用 SQL Monitor 分析菜单看到了这一点。

这是 2014 SQL Server 上 Ola 日志文件的输出,CPU 从大约 2:10 到 2:45 变为 100%:

Date and time: 2017-06-24 02:10:20  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:07:48  
Date and time: 2017-06-24 02:18:08  
Run Code Online (Sandbox Code Playgroud)
Date and time: 2017-06-24 02:18:08  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000006_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:32:22  
Date and time: 2017-06-24 02:50:30  
Run Code Online (Sandbox Code Playgroud)

以下是 2008 R2 SQL Server 上的 Ola 日志文件输出,用于上述两个统计数据,但 CPU 可能达到 15%:

Date and time: 2017-06-24 03:30:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000003_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:05:00  
Date and time: 2017-06-24 03:35:32  
Run Code Online (Sandbox Code Playgroud)
Date and time: 2017-06-24 03:35:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000004_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:52:31  
Date and time: 2017-06-24 04:28:03
Run Code Online (Sandbox Code Playgroud)

我无法使用 server maxdop=1 运行它们,因为这会消除所有并行计划生成,并且可能会损害应用程序。我打算反其道而行之,将其增加到 8 个(盒子上有 16 个内核),看看会发生什么。可能会走得更快以减少 CPU 固定的时间长度。此作业在用户大部分离开时运行。

小智 0

社区维基回答

最佳猜测:选择更新统计数据的计划在 2014 年的盒子上比在 2008 R2 的盒子上是并行的,或者更加并行。

并行更新统计信息fullscan自 2005 年以来就已存在,有关从 2016 年开始的采样统计信息,请参阅SQL Server 数据库引擎博客上的 Gjorgji Gjeorgjievski 撰写的SQL Server 2016 中的查询优化器添加。

如果您有企业版,则可以使用资源调控器来限制维护作业使用的 CPU。

还可以考虑投票支持 Javier Villegas 的 Connect 建议“将参数添加MAXDOP到更新统计信息”。

相关问答:并行统计更新