2017-05-09 70 views
0

我们有一个大小为1257GB的数据库,其中包含100个以上按小时事务处理的对象(插入和更新)。我们有Auto Update statistics:TrueAuto Update statistics asynchronously : False为什么自动更新统计信息无法有效提高性能

当我们触发查询来获取数据需要很长时间。但是当我们手动执行SP_UpdateStats时,相同的查询花费的时间非常少,以获取相同数量的数据。

请让我知道我们是否需要定期更新统计信息?使用EXEC SP_UpdateStats有什么优缺点?

Windows服务器2012R2和SSMS2014。

回答

2

但是,当我们手动exec的SP_UpdateStats,同样的查询花费非常少的时间来获取数据

即使您已设置为true,自动更新统计信息的一样多,你的统计数据不会经常更新

SQLServer triggers automatic statistics update,based on certain thresholds和低于阈值,拥有良好的所有版本低于SQLServer的2016

  • 表格大小已经从0到> 0行(测试1)。

  • 收集统计信息时,表中的行数为500或更少,自此(统计信息对象)的统计信息对象的前导列的colmodctr自此以后发生了更改(测试2)。

  • 收集统计信息时,该表有超过500行,并且当统计信息是统计信息时,统计信息对象的前导列的colmodctr已更改超过表的行数的500 + 20%聚集(测试3)。

所以根据你的表有多大,你可以决定使用上述公式

与SQLServer的2016开始的门槛,这个门槛已经改变,统计数据将被更频繁地触发。

The same behaviour can be obtained in older versions with the help of traceflag 371

例如,如果跟踪标志被激活(在默认情况下的SQLServer 2016激活),更新的统计将在一个表时发生百万变化触发1个十亿行。

如果跟踪标志未激活,那么在触发更新统计信息之前,具有10亿条记录的同一个表需要2亿次更改。

请问我们是否需要定期更新统计数据?使用EXEC SP_UpdateStats有哪些优缺点?

如果你看到由于不准确的统计数据不理想的计划,继续安排这个新的标志

谈到缺点,如果你经常更新的统计数据,你会看到查询计划得到重新编译,这将反过来原因再次编译计划时的CPU压力

2

Sp_UpdateStats将更新所有表的统计信息。布伦特奥扎尔认为,这应该做得更有规律,然后做索引重组或重建。通过更新您的统计信息,SQL Server更有可能创建一个“更好”的查询计划。其缺点是所有表格的统计数据(无论他们是否需要)都将被更新,并且可能需要大量资源才能完成。当机器没有被大量使用时,许多DBA每晚或每周运行sp_updatestats。有些脚本会检查要更新的表,并且只更新哪些表。

看到不同的方法来更新统计这是一个良好的开端: https://www.brentozar.com/archive/2014/01/update-statistics-the-secret-io-explosion/

如果查询运行速度慢但更可能有与查询等问题。您应该发布查询和查询计划,并且社区可能会提供有用的提示来改进查询或向基础表添加索引。

+0

Joshi,请不要在将来编辑我的意见。有更好的方法来获得积分,然后将sp_Updatestats设置为反色。 –

相关问题