mssql sqlserver 检测过期统计信息的方法分享


摘要:
下文讲述mssql sqlserver中,获取过期统计信息的方法分享,如下所示:
实验环境:sql server 2008 R2



统计信息的作用:

在sqlserver中,拥有正确的统计信息,可以使sqlserver生成良好的执行计划,快速精准的运行sql,并得到所需要的结果。
通过定期重新生成统计信息,可以加快数据的各种查询操作,下文将讲述获取过期统计信息的方法,如下所示:

  SELECT 
     [表名]=OBJECT_NAME(i.OBJECT_ID)
    ,[对象类型]=o.type_desc
    ,[统计信息名称]=i.[name]
    ,[统计信息最后更新时间] = STATS_DATE(i.OBJECT_ID, i.index_id)
    ,[统计信息修改]=si.rowmodctr
    ,[统计信息数]=si.rowcnt
FROM sys.indexes i 
JOIN sys.objects o ON    i.OBJECT_ID=o.OBJECT_ID
JOIN sys.sysindexes si ON    i.OBJECT_ID=si.id
    AND i.index_id=si.indid 
WHERE  o.TYPE <> 'S' AND STATS_DATE(i.OBJECT_ID, i.index_id) IS NOT NULL
UNION ALL
SELECT 
     [表名]=OBJECT_NAME(o.OBJECT_ID)
    ,[对象类型]=o.type_desc
    ,[统计信息名称]=s.name
    ,[统计信息最后更新时间]= STATS_DATE(o.OBJECT_ID, s.stats_id)
    ,[统计信息修改]=si.rowmodctr
    ,[统计信息数]=ir.rowcnt
FROM sys.stats s INNER JOIN sys.objects o ON s.OBJECT_ID=o.OBJECT_ID
JOIN sys.sysindexes si ON s.OBJECT_ID=si.id AND s.stats_id= si.indid
INNER JOIN (SELECT id,rowcnt FROM sys.sysindexes WHERE indid IN (0,1)) IR
ON IR.id=o.OBJECT_ID  WHERE  o.TYPE <> 'S'  
AND (s.auto_created=1 OR s.user_created=1)AND STATS_DATE(o.OBJECT_ID, s.stats_id) IS NOT NULL