理解统计信息(5/6):如何检测过期的统计信息
在 理解统计信息(4/6):自动更新统计信息的阀值——人为更新统计信息的重要性 里,我们讨论了自动更新统计信息的阀值,这个阀值在某些情况下,基于自动更新的统计信息还是可以获得最优的执行计划的。在大多数情况下,人为更新统计信息可以获得更好的性能。这个文章,我们可以来看下如何检测过期的统计信息。
在SQL Server 2005以后的版本里,SQL Server使用ColModCtr 对统计的主要列对象进行跟踪。但在 SQL server 2005或SQL server 2008里没有对应的DMV进行查询,直到SQL server 2008 R2 (SP2) 开始的版本,才有sys.dm_db_stats_properties 对统计的主要列对象改变有详细的统计信息。
对于老版本的SQL Server用户来说,我们需要基于sys.sysindexes的可用rowmodctr。自SQL Server 2005开始的版本,rowmodctr已经与老版本不再兼容。在SQL Server早期版本里,数据库引擎维护行级别的计数器修改(row-level modification counters)。这些计数器现在在列级别维护。因此,rowmodctr用来计算和生成的结果与早期版本的计数器类似,但不完全等同。
下面的查询可以列出在统计信息里的预估改变:
1 SELECT 2 TableName=OBJECT_NAME(i.OBJECT_ID) 3 ,ObjectType=o.type_desc 4 ,StatisticsName=i.[name] 5 ,statisticsUpdateDate = STATS_DATE(i.OBJECT_ID, i.index_id) 6 ,RecordModified=si.rowmodctr 7 ,NumberofRecords=si.rowcnt 8 FROM sys.indexes i 9 JOIN sys.objects o ON i.OBJECT_ID=o.OBJECT_ID 10 JOIN sys.sysindexes si ON i.OBJECT_ID=si.id 11 AND i.index_id=si.indid 12 WHERE o.TYPE <> 'S' AND STATS_DATE(i.OBJECT_ID, i.index_id) IS NOT NULL 13 UNION ALL 14 SELECT 15 TableName=OBJECT_NAME(o.OBJECT_ID) 16 ,ObjectType=o.type_desc 17 ,StatisticsName=s.name 18 ,statisticsUpdateDate= STATS_DATE(o.OBJECT_ID, s.stats_id) 19 ,RecordModified=si.rowmodctr 20 ,NumberofRecords=ir.rowcnt 21 FROM sys.stats s INNER JOIN sys.objects o ON s.OBJECT_ID=o.OBJECT_ID 22 JOIN sys.sysindexes si ON s.OBJECT_ID=si.id AND s.stats_id= si.indid 23 INNER JOIN (SELECT id,rowcnt FROM sys.sysindexes WHERE indid IN (0,1)) IR 24 ON IR.id=o.OBJECT_ID WHERE o.TYPE <> 'S' 25 AND (s.auto_created=1 OR s.user_created=1)AND STATS_DATE(o.OBJECT_ID, s.stats_id) IS NOT NULL
根据这个查询结果,加上我们系统中现运行查询的工作量/类别,我们就可以在合适的时间用计划任务定期对统计信息进行更新,不用盲目的更新所有统计信息。继续围观统计信息总结。
参考文章:
注:此文章为WoodyTu学习MS SQL技术,收集整理相关文档撰写,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?