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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文: 第十二章——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
目录
相关文章
|
6月前
|
前端开发 Java 数据库
JSp城市生活信息收集发布网myeclipse开发sqlserver2008数据库BS模式java编程网页结构struts2
JSP城市生活信息收集发布网是一套完善的web设计系统,对理解JSP java编程开发语言有帮助 struts2 dao+bean mvc模式,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为sqlserver2008,使用java语言开发,系统主要采用B/S模式开发。
23 0
|
6月前
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
48 0
|
9月前
|
SQL 数据库 Windows
在配置SQL server 2014时出现“附加数据库时出错。有关详情信息请单机“消息”列中的超链接”问题如何解决
在配置SQL server 2014时出现“附加数据库时出错。有关详情信息请单机“消息”列中的超链接”问题如何解决
116 0
|
开发框架 监控 前端开发
云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
|
数据库 数据安全/隐私保护 Windows
成功解决启动SQLServer失败,根据错误信息判断错误故障
成功解决启动SQLServer失败,根据错误信息判断错误故障
|
SQL 运维 Go
sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)
原文:sql server 运维时CPU,内存,操作系统等信息查询(用sql语句) 我们只要用到数据库,一般会遇到数据库运维方面的事情,需要我们寻找原因,有很多是关乎处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲的就是如何查询它们的相关信息。
1070 0
|
SQL 索引 数据库
sql server 索引阐述系列八 统计信息
原文:sql server 索引阐述系列八 统计信息 一.概述     sql server在快速查询值时只有索引还不够,还需要知道操作要处理的数据量有多少,从而估算出复杂度,选择一个代价小的执行计划,这样sql server就知道了数据的分布情况。
965 0
|
SQL Go 应用服务中间件
SQL Server如何用触发器捕获DML操作的会话信息
原文:SQL Server如何用触发器捕获DML操作的会话信息 需求背景        上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因;文档缺少;以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作。
882 0
|
SQL 缓存 数据库
SqlServer性能优化之获取缓存的查询计划中的聚合性能统计信息
SqlServer性能优化之获取缓存的查询计划中的聚合性能统计信息
4291 0
|
SQL Go 存储
SQL点滴13—收集SQLServer线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据。    sys.dm_os_wait_stats 这是一个系统视图,里面存储线程所遇到的所有的等待信息,具体的列如下表 列名 数据类型 说明 Wait_type Nvarchar(60) 等待类型名称 waiting_tasks_count Bigint 等待类型的等待数。
740 0