标签归档:统计信息

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

mssql sqlserver sp_autostats 关键字简介说明


摘要:
下文讲述 sp_autostats 关键字的功能及用法说明,如下所示:
实验环境:sql server 2008 R2



sp_autostats 功能及语法说明

sp_autostats 功能:
显示或更改索引或统计信息的自动设置现象。
sp_autostats 语法说明:
sp_autostats [@tblname=] ‘table_name’
[,[@flagc=] ‘stats_flag’]
[,[@indname=] ‘index_name’]
——————-参数说明—————-
[@tblname =] ‘table_name’
待检测的表和视图名称,此处参数类型为nvarchar(776)
[@flagc =] ‘stats_flag’
此处参数输入 ON 或 OFF ,缺省输入时为NULL
[@indname =] ‘index_name’
此处缺省值为NULL
此处输入待启用或禁用的索引名称
——————返回值说明————–
0 代表操作成功
1 代表操作失败

sp_autostats 举例说明

  
 ---显示表"testTableName"下所有索引及统计信息是否开启自动统计
 ----和统计信息的最后更新时间
 EXEC sp_autostats testTableName
 
 ---启用表 testTableName 下所有统计信息自动统计功能
 EXEC sp_autostats testTableName, 'ON'
 
 ---禁用表 testTableName下所有统计信息自动统计功能
 EXEC sp_autostats testTableName, 'OFF'
 

 ---禁用表"testTableName" 下索引 IX_test的自动统计信息
  
EXEC sp_autostats testTableName,'OFF',IX_test 


注意事项:
运行此存储过程的用户,须具有 db_owner 和 db_ddladmin 服务器角色

mssql sqlserver统计信息的重要性


摘要:
在sqlserver中,统计信息的功能为帮助数据库引擎预估出正确的执行计划,
缩短sql运行时间,使sql运行更高效,下文将记录一次sql统计信息导致的异常


前几天,编写了一个数据抽取脚本,前一段时间还运行正常,最近运行时间突然超出所有人的预估,整整耗时10个小时,
开始我们以为是硬件发生了变化,通过仔细询问多方了解发现硬件最近几天没有发生任何变化,我们又对最近几天数据的增加量进行了
检查,发现最近数据增加也是按照要求在正常运行,在所有外部环境都没有发生大变化时,此时sql脚本执行慢,只能界定为sql server数据引擎内部出现异常,

最后我们整个数据库的统计信息进行了全部更新,第二天数据统计脚本,只用了10分钟就生成完毕。

通过这次的事件,让我认识到了统计信息对数据库引擎的重要性,统计信息的异常,会导致数据库执行时使用错误的执行计划,
预估错误的执行时间,导致很多不必要的开销和内存占用的错误估算,严重者会导致sql引擎宕机。
记录此信息,以后遇到数据库查询慢,先分析统计信息是否正确。