你的位置:首页 > 软件开发 > 数据库 > 理解统计信息(5/6):如何检测过期的统计信息

理解统计信息(5/6):如何检测过期的统计信息

发布时间:2015-05-23 00:00:51
在 理解统计信息(4/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_ID10 JOIN sys.sysindexes si ON  i.OBJECT_ID=si.id11   AND i.index_id=si.indid 12 WHERE o.TYPE <> 'S' AND STATS_DATE(i.OBJECT_ID, i.index_id) IS NOT NULL13 UNION ALL14 SELECT 15   TableName=OBJECT_NAME(o.OBJECT_ID)16   ,ObjectType=o.type_desc17   ,StatisticsName=s.name18   ,statisticsUpdateDate= STATS_DATE(o.OBJECT_ID, s.stats_id)19   ,RecordModified=si.rowmodctr20   ,NumberofRecords=ir.rowcnt21 FROM sys.stats s INNER JOIN sys.objects o ON s.OBJECT_ID=o.OBJECT_ID22 JOIN sys.sysindexes si ON s.OBJECT_ID=si.id AND s.stats_id= si.indid23 INNER JOIN (SELECT id,rowcnt FROM sys.sysindexes WHERE indid IN (0,1)) IR24 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

原标题:理解统计信息(5/6):如何检测过期的统计信息

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录