前言:

统计信息是关于谓词中的数据分布的主要信息源,假设不知道详细的数据分布,优化器不能获得预估的数据集。从而不能统计须要返回的数据。

在创建列的统计信息后,在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研究之统计信息—发现过期统计信息并处理具体解释的更多相关文章

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

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

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

    http://www.2cto.com/database/201208/149850.html   删除SQL Server Management Studio中保存的帐户信息   SQL Serve ...

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

    最近一个多月,甚是悠哉,无事可做.上线的网站系统也没接到客户的反馈,反而觉得无聊之极了.上周五早上,一上QQ,就收到客户发来消息,管理平台无法登陆了.心里一惊,立马开始查找故障原因.翻看了系统日志,提 ...

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

    程序预先说明: 本文访问的数据库是基于存有RDF三元组的开源数据库Localyago修改的库,其中只有一个表,表中有五个属性:主语subject.谓语predict.宾语object.主语的编号sub ...

  5. 显示 Sql Server 中所有表或表中行的信息

    在MSSQL中显示某个数据库中所有表或视图的信息: (以下语句为获取所有表信息,将绿色字"U"替换为"V"则获取所有视图信息.) SELECT sysobjec ...

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

    由于前一段时间胃痛,导致博客园博客都停更了一个月左右.近几天,胃病终于稍微有所好转,决定重新写博文. 前几天,有个朋友刚好问到本人有关 SQL 语句,大致是原表有两列,分别为月份.月份销售额,而需要一 ...

  7. SQL Server还原和一些小发现

    1.当数据库已经建好在DB里,SQL Server 2005 和 SQL Server 2008使用.Bak文件还原的时候,会出现 error : "The backup set holds ...

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

    1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip ...

  9. SQL Server 2005/2008遍历所有表更新统计信息

    DECLARE UpdateStatisticsTables CURSOR READ_ONLY FOR 02   SELECT sst.name, 03          Schema_name(ss ...

随机推荐

  1. tcp 三次握手和四次断连深入分析:连接状态和socket API的关系----BAT 李运华

    http://blog.csdn.net/yunhua_lee/article/details/40513677 http://blog.csdn.net/yah99_wolf/article/cat ...

  2. eclipse中jar包打断点

    eclipse中jar包打断点 1. 下载工具 链接:http://pan.baidu.com/s/1dEF5tqL 密码:md4m 2. 增加jadeclipse功能 把 net.sf.jadcli ...

  3. BFS求最短路

    假设有一个n行m列的迷宫,每个单位要么是空地(用1表示)要么是障碍物(用0表示).如和找到从起点到终点的最短路径?利用BFS搜索,逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点. ...

  4. THINKPHP nginx设置路由为PATHINFO模式

    首先THINKPHP配置文件中设置 //url访问模式为rewrite模式 'URL_MODEL'=>'2', 然后再在nginx.conf文件中,找到这一条语句 #access_log log ...

  5. react with JSX for {if…else…}

    在react中用jsx渲染dom的时候经常会遇到if条件判断,然而在jsx中竟是不允许if条件判断的.以下有几种判断方式,可以根据自己的应用场景,挑选适合的 https://blog.csdn.net ...

  6. 拉格朗日对偶与kkt条件

  7. 使用ffmpeg截取视频封面并批量上传

    需求:将视频文件压入zip包,然后上传服务器.服务器对zip解压,使用bat/shell,使用ffmpeg对视频进行封面截取.再使用OSS对视频和封面进行批量上传.最后将信息存入数据库 遇到的问题 1 ...

  8. 代码验证C#执行”文件打开关闭操作“耗时

    2017-04-19 部门经理习惯用C#做数据清洗,遇到个需要验证的问题,在一个万次左右循环内对文件执行打开关闭操作,比在循环前打开文件.循环后关闭文件耗时多多少. using System; usi ...

  9. SELinux的Docker安全性

    原文译自:http://opensource.com/business/14/7/docker-security-selinux 这篇文章基于我今年在DockerCon一个讲座,它将讨论我们当前听到的 ...

  10. PS如何精确设置参考线,标尺,辅助线

    如图所示,我要均分画布的垂直方向为三份.因为要图标的三个位置文件吻合的很精确.我们先拉好头尾两条辅助线 在标尺上右击可以切换显示的单位,但是还是不够精确.因为这个画布是64×192的.我要64×64给 ...