SQL Server研究之统计信息—发现过期统计信息并处理详解



前言:

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

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

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

从2000开始,SQLServer对增删改操作会增加在表sysindexes中的RowModCtr(Row
Modification Counter)值,当统计信息更新后,该值会重置会0,并重新累加。所以查看这个表的这个值就可以知道统计信息是否过时。上章研究了非索引键上统计信息的影响详解不明白的可以去看下。

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

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

准备工作:

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

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

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

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

步骤:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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 Server研究之统计信息—发现过期统计信息并处理详解

时间: 2024-08-12 20:41:17

SQL Server研究之统计信息—发现过期统计信息并处理详解的相关文章

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

原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据. 在创建列的统计信息后,在DML操作如insert.update.delete后,统计信息就会过时.因为这些操作更改了数据,影响了数据分布.此时需要更新统计信息. 在高活动的表中,统计信息可能几个小时就会过时.对于静态表,可能几个星期才会过时.这要视乎表上DML的操作. 从2000开始,

[转]删除SQL Server Management Studio中保存的帐户信息

http://www.2cto.com/database/201208/149850.html 删除SQL Server Management Studio中保存的帐户信息 SQL Server 2005 Management Studio 删除以下路径中的mru.dat文件 2003/XP C:\Documents and Settings\Administrator\Application Data\Microsoft\Microsoft SQL Server\90\Tools\Shell\

SQL Server还原和一些小发现

当数据库已经建好在DB里,SQL Server 2005 和 SQL Server 2008使用.Bak文件还原的时候,会出现 error : "The backup set holds a backup of a database other than the existing" 查了网上的方法: 方法一[未验证] [sql] view plaincopy --返回由备份集内包含的数据库和日志文件列表组成的结果集. --主要获得逻辑文件名 --返回由备份集内包含的数据库和日志文件列表

SQL Server研究之使用资源调控器管理资源

前言: 在前一章已经演示了如何使用SSMS来配置资源调控器.但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展.并且可以在不同服务器快速部署. 下面来演示如何实现: 步骤: 1.  打开ssms,连到SQLServer.确保登录账号有CONTROLSERVER的权限. 2.  运行下面脚本,删除前面创建过的资源调控器对象 USE master GO DROP WORKLOAD GROUP rg_WebApp DROP RESOURCE POOL rp_WebApp DROP WORKLO

Android研究之属性动画(Property Animation)完全解析详解下

 上一篇Android研究之属性动画(Property Animation)完全解析详解上已经基本展示了属性动画的核心用法: ObjectAnimator实现动画,ValueAnimator实现动画,AnimatorSet的使用等~ 当然了属性动画还有一部分的知识点,也能做出很不错的效果,将在本篇博客为您展示~ 1.如何使用xml文件来创建属性动画 大家肯定都清楚,View Animator .Drawable Animator都可以在anim文件夹下创建动画,然后在程序中使用,甚至在The

Sql Server 2008开发版(Developer Edition)过期升级企业版(Enterprise Edition)失败后安装学习版

最近一个多月,甚是悠哉,无事可做.上线的网站系统也没接到客户的反馈,反而觉得无聊之极了.上周五早上,一上QQ,就收到客户发来消息,管理平台无法登陆了.心里一惊,立马开始查找故障原因.翻看了系统日志,提示数据库连接超时(见下图). 打开vs,运行程序,同样报错,数据库连接超时.找到报错位置的SQL语句,只是很简单的一条查询语句.连接字符串也没有问题,怎么会报错呢?百思不得其解,于是乎,打算到查询分析器执行一下这条SQL语句,看看结果如何.接着,出现了下面的情况. 搜迪斯内,原来是Sql Serve

【SQL Server 2012】按倒序存储“分组统计”结果的临时表到新建表

程序预先说明: 本文访问的数据库是基于存有RDF三元组的开源数据库Localyago修改的库,其中只有一个表,表中有五个属性:主语subject.谓语predict.宾语object.主语的编号subid,宾语的编号objid.每条记录由(subject,predict,object,subid,objid)组成.其中当宾语为字符型而不是实体时(比如"2011"),编号默认为0.有以下数据表: 程序需求: 统计每个主语有多少相关的谓语属性(每个谓语可有多个宾语),即有多少以该实体作为主

SQL SERVER:开窗函数 SUM() OVER() 数据统计中一例使用

由于前一段时间胃痛,导致博客园博客都停更了一个月左右.近几天,胃病终于稍微有所好转,决定重新写博文. 前几天,有个朋友刚好问到本人有关 SQL 语句,大致是原表有两列,分别为月份.月份销售额,而需要一条 SQL 语句实现统计出每个月份以及当前月以前月份销售额和.尼玛,感觉还是没有说清,下面用图表示.      SQL 测试表脚本        DECLARE @Temp Table ( ID INT, --- 月份 MoneyData Float --- 金额 ) insert INTO @TE

使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)

1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip * @param port * @param databaseName * @return*/ public static String getTestDbUrl(int dbType, String ip, String port, String databaseName){ String ur