第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

简介: 原文: 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理 前言:        统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据。
原文: 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

前言:

        统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据。

        在创建列的统计信息后,在DML操作如insertupdatedelete后,统计信息就会过时。因为这些操作更改了数据,影响了数据分布。此时需要更新统计信息。

        在高活动的表中,统计信息可能几个小时就会过时。对于静态表,可能几个星期才会过时。这要视乎表上DML的操作。

        从2000开始,SQLServer对增删改操作会增加在表sysindexes中的RowModCtrRow Modification Counter)值,当统计信息更新后,该值会重置会0,并重新累加。所以查看这个表的这个值就可以知道统计信息是否过时。

        在2000之后,SQLServer改变了这种跟踪方式,把更改存放到对应的数据行上。这个值是未公开的ColModCtr

        但是sys.sysindexes2012依旧可用,还是可以用这个表的数值来确定是否过期。

 

准备工作:

本文将用到下面的系统视图和兼容性视图:

1、  sys.sysindexes:兼容性视图,提供RowModCtr列值,是本文的核心。

2、  sys.indexes:使用表ID来获得统计信息名。

3、  sys.objects:获取架构名。

 

步骤:

显示RowModCtr值很高的统计信息:

SELECT DISTINCT

        OBJECT_NAME(SI.object_id) AS Table_Name ,

        SI.name AS Statistics_Name ,

        STATS_DATE(SI.object_id, SI.index_id) AS Last_Stat_Update_Date ,

        SSI.rowmodctr AS RowModCTR ,

        SP.rows AS Total_Rows_In_Table ,

        'UPDATE STATISTICS [' + SCHEMA_NAME(SO.schema_id) + '].['

        + OBJECT_NAME(SI.object_id) + ']' + SPACE(2) + SI.name AS Update_Stats_Script

FROM    sys.indexes AS SI( NOLOCK )

        INNER JOIN sys.objects AS SO( NOLOCK ) ON SI.object_id = SO.object_id

        INNER JOIN sys.sysindexes SSI( NOLOCK ) ON SI.object_id = SSI.id

                                                    AND SI.index_id = SSI.indid

        INNER JOIN sys.partitions AS SP ON SI.object_id = SP.object_id

WHERE   SSI.rowmodctr > 0

        AND STATS_DATE(SI.object_id, SI.index_id) IS NOT NULL

        AND SO.type = 'U'

ORDER BY RowModCTR DESC


 

 

分析:

需要了解一些事情:

1、  从你上次更新统计信息是何时的事情?

2、  在更新统计信息之后有多少事务发生在表上?

3、  哪些T-SQL需要用于更新统计信息。

4、  更新统计信息是否可行?这个是对比RowModCTR列和Total_Rows_In_Table列。

 

当在数据库开启了Auto_Update_Statistics之后,还有数据的话,那就有必要更新统计信息。下面有一些规则:

1、  表大小从0增长。

2、  当表的数据小于等于500时没有问题,并且ColModCtr从超过500行之后开始增长。

3、  当表的行数超过500行时,在统计信息对象的引导列的ColModCtr值超过500+20%的行数时,就需要更新。

例子:有一个100万行的表,优化器会在插入200500行新数据后认为统计信息过时。但是这并不是绝对化的。

 

扩充知识:

没有直接的方式访问ColModCtr的值,因为它只是用于优化引起,并且对用户透明,但是可以使用DAC(专用管理员连接)来访问sys.sysrscols.rcmodified系统。但是仅在2008R2及以后版本才可用。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
5月前
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
33 0
|
12月前
|
开发框架 监控 前端开发
云LIS平台源码,基于B/S架构的实验室信息系统,技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis
支持Westguard,Gubbuss+T(n)等多种质控规则,自动判断是否失控,可自动计算靶值、SD,多个质控品可列于一个图表上;每个质控品每天可多达7次结果,可使用平均值、最后一次结果,最好一次结果画图等;靶值可自动计算,免疫等支持按季度或者自定义日期画图
云LIS平台源码,基于B/S架构的实验室信息系统,技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis
|
SQL 运维 Go
sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)
原文:sql server 运维时CPU,内存,操作系统等信息查询(用sql语句) 我们只要用到数据库,一般会遇到数据库运维方面的事情,需要我们寻找原因,有很多是关乎处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲的就是如何查询它们的相关信息。
1062 0
|
SQL 索引 数据库
sql server 索引阐述系列八 统计信息
原文:sql server 索引阐述系列八 统计信息 一.概述     sql server在快速查询值时只有索引还不够,还需要知道操作要处理的数据量有多少,从而估算出复杂度,选择一个代价小的执行计划,这样sql server就知道了数据的分布情况。
958 0
|
SQL 缓存 数据库
SqlServer性能优化之获取缓存的查询计划中的聚合性能统计信息
SqlServer性能优化之获取缓存的查询计划中的聚合性能统计信息
4281 0
|
存储 数据库
SQLServer 订阅过期解决方法
原文:SQLServer 订阅过期解决方法 由于分发数据库执行一个较长的事务,达到了系统预定的72小时,导致了该订阅过期,数据库分发代理已不可再启用,提示错误如下: 错误信息:已将此(这些)订阅标记为不活动,必须将其重新初始化。
1752 0
SQLServer过期的解决方案
看图吧,不喜欢说话,图里面我都打备注了 0SQLService异常 1找到安装中心 2升级版本 3监测ing 4输入升级key 5同意并下一步 6下一步 7下一步 8下一步 9收工 10可以打开了 作者:毒逆天 出处:https://www.cnblogs.com/dotnetcrazy 打赏:18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z 本文版权归作者和博客园共有。
860 0
|
SQL 数据库 Windows
sql server 过期
引用:http://hi.baidu.com/itpangdun/blog/item/8d3fbf351c3447a0d1a2d32e.html   问题现象: 本地计算机 上的 MSSQLSERVER 服务启动后又停止了。
948 0