加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SQLSERVER更新统计信息UPDATE STATISTICS

(2015-09-18 09:24:32)
标签:

it

分类: sqlserver

http://www.cnblogs.com/TeyGao/p/3553978.html

http://blog.csdn.net/dba_huangzj/article/details/8702293

当数据库设置为自动更新统计后,SQL Server 监控表中的数据更改,当更改满足一下条件之一时更新:
1.向空表插入数据时 
2.少于500行的表增加500行或者更多 
3.当表中行多于500行时,数据的变化量大于20%时 
(在SQL SERVER 2000中,指的是20%的行被修改,而在SQL SERVER 2005/2008中,指的是20%的列数据被修改)

可以手动使用UPDATE STATISTICS 或EXEC sys.sp_updatestats来更新统计
UPDATE STATISTICS 需要锁表
UPDATE STATISTICS table_or_indexed_view_name 
   
       
            { index_or_statistics__name }
          | ( { index_or_statistics_name } [ ,...n ] ) 
                }
   
      WITH 
       
            FULLSCAN 
            | SAMPLE number { PERCENT | ROWS } 
            | RESAMPLE 
            | [ ,...n ]
       
        [ [ , ] [ ALL | COLUMNS | INDEX ] 
        [ [ , ] NORECOMPUTE ] 
    ] ;

::=
    [ STATS_STREAM = stats_stream ]
    [ ROWCOUNT = numeric_constant ]
    [ PAGECOUNT = numeric_contant ]
table_or_indexed_view_name 
要更新其统计信息的表或索引视图的名称。

index_or_statistics_name 
要更新其统计信息的索引的名称,或要更新的统计信息的名称。如果不指定 index_or_statistics_name,则查询优化器将更新表或索引视图的所有统计信息。 这包括使用 CREATE STATISTICS 语句创建的统计信息、在

AUTO_CREATE_STATISTICS 为 ON 时创建的单列统计信息以及为索引创建的统计信息。 
有关 AUTO_CREATE_STATISTICS 的详细信息,请参阅 ALTER DATABASE SET 
选项 (Transact-SQL)。若要查看某一表或视图的所有索引,您可以使用 sp_helpindex。

FULLSCAN
通过扫描表或索引视图中的所有行来计算统计信息。FULLSCAN 和 SAMPLE 100 PERCENT 
的结果相同。 FULLSCAN 不能与 SAMPLE 
选项一起使用。

SAMPLE number { PERCENT | ROWS }
指定当查询优化器更新统计信息时要为其使用的表或索引视图中近似的百分比或行数。对于 PERCENT,number 可以介于 0 到 100 之间;对于 ROWS,number 可以介于 0 
到总数行之间。 查询优化器抽样的实际行百分比或行数可能与指定的行百分比或行数不匹配。 例如,查询优化器扫描数据页上的所有行。 对于基于默认抽样的查询计划并非最佳的特殊情况,SAMPLE 非常有用。在大多数情况下,不必指定

SAMPLE,这是因为在默认情况下,查询优化器根据需要采用抽样,并以统计方式确定大量样本的大小,以便创建高质量的查询计划。 
SAMPLE 不能与 FULLSCAN 选项一起使用。如果未指定 SAMPLE 和 FULLSCAN,查询优化器则默认使用抽样数据并计算样本大小。 
我们建议不指定 0 PERCENT 或 0 ROWS。如果指定 0 PERCENT 或 0 ROWS,则将更新统计信息对象,但该对象不包含任何统计信息数据。

RESAMPLE
使用最近的采样速率更新每个统计信息。
使用 RESAMPLE 会导致全表扫描。例如,索引的统计信息使用全表扫描来获取其采样速率。 如果未指定采样选项(SAMPLE、FULLSCAN、RESAMPLE),则查询优化器默认将对数据进行抽样并计算样本大小。 
ALL | COLUMNS | INDEX
更新所有现有统计信息、在一列或多列上创建的统计信息或为索引创建的统计信息。如果未指定上述任何选项,则 UPDATE STATISTICS 
语句将更新表或索引视图上的所有统计信息。

NORECOMPUTE
为指定统计信息禁用自动统计信息更新选项

AUTO_UPDATE_STATISTICS。如果指定此选项,则查询优化器将完成此统计信息更新并禁用将来的更新。 
若要重新启用 AUTO_UPDATE_STATISTICS 选项行为,请不使用 
NORECOMPUTE 选项再次运行 UPDATE STATISTICS,或运行 sp_autostats。
 

--================================================================

同事扔过一条SQL,跟我说生产服务器上执行得好好的,测试环境很慢,问我是不是有阻塞,执行一看,的确很慢,一分钟还没有结束,运行查看阻塞的语句,发现没有阻塞,但是逻辑读特别高,使用SET STATISTICS IO ON,发现逻辑读集中某两张表上,查看实际执行计划,发现预估执行次数和实际执行次数相差上万倍,于是毫不犹豫执行EXEC sys.sp_updatestats,更新统计结束后,原来执行超过1分钟的查询不到1秒结束

看来定期更新统计还是很有必要的。

https://msdn.microsoft.com/zh-cn/library/ms190330(v=sql.105).aspx


A. 返回表的最近统计信息的日期

下面的示例返回 Person.Address 表上的每个统计信息对象的最新更新的日期。


USE AdventureWorks2008R2;
GO
SELECT name AS stats_name, 
    STATS_DATE(object_id, stats_id) AS statistics_update_date
FROM sys.stats 
WHERE object_id = OBJECT_ID('Person.Address');
GO

如果统计信息对应于索引,则 sys.stats 目录视图中的 stats_id 值与 sys.indexes 目录视图中的 index_id 值相同,下面的查询返回与上一查询相同的结果。如果统计信息不对应于索引,则它们将位于 sys.stats 结果中,但是不在 sys.indexes 结果中。


USE AdventureWorks2008R2;
GO
SELECT name AS index_name, 
    STATS_DATE(object_id, index_id) AS statistics_update_date
FROM sys.indexes 
WHERE object_id = OBJECT_ID('Person.Address');
GO

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有