zoukankan      html  css  js  c++  java
  • SQL Server-更新统计信息

    文章出自:https://yq.aliyun.com/articles/67176

    摘要:

    1.何时更新统计信息

    (1)查询执行缓慢,或者查询语句突然执行缓慢。这种场景很可能是由于统计信息没有及时更新而遭遇了参数嗅探的问题。

    (2)当大量数据更新(INSERT/DELETE/UPDATE)到升序或者降序的列时,这种情况下,统计信息直方图可能没有及时更新。

    (3)建议在除索引维护(当你重建、整理碎片或者重组索引时,数据分布不会改变)外的维护工作之后更新统计信息。

    (4)数据库的数据更改频繁,建议最低限度每天更新一次统计信息。数据仓库可以适当降低更新统计信息的频率。

    (5)当执行计划出现统计信息缺失警告时,需要手动建立统计信息

    2.如何查找过期的统计信息

    (1)假设定义超过30天未更新的统计信息算过期的话,那么查找过期的统计信息语句如下:USE test01GO

    DECLARE
    @day_before int = 30;
    SELECT 

    Object_name = OBJECT_NAME(object_id)
    ,Stats_Name = [name]
    ,Stats_Last_Updated = STATS_DATE([object_id], [stats_id])
    FROM sys.stats WITH(NOLOCK)
    WHERE STATS_DATE([object_id], [stats_id]) <= DATEADD(day, -@day_before, getdate())
    order by Stats_Last_Updated desc;

    (2)查找到过期的统计信息以后,接下来需要手动更新统计信息,我们可以从下面三个维度来达到目的:

    更新索引级别统计信息
    更新单表级别统计信息
    更新整个数据库级别统计信息

    USE test01
    GO
    --update statistcis for a specify statistic
    UPDATE STATISTICS dbo.Rose PK_Rose;
    GO

    --update statistcis for a specify table
    UPDATE STATISTICS dbo.Rose WITH FULLSCAN;
    GO

    --update statistcis for a specify database
    USE test01
    GO
    EXEC sys.sp_updatestats
    GO

    (3)更新实例级别统计信息

    USE master
    GO

    DECLARE
    @sql NVARCHAR(MAX)
    ;

    SET
    @sql = N'
    USE [?]
    IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'', ''distribution'')
    BEGIN
    RAISERROR(N''--------------------------------------------------------------
    Search on database: ?'', 10, 1) WITH NOWAIT
    EXEC sys.sp_updatestats
    END
    '
    ;

    EXEC SYS.SP_MSFOREACHDB @sql,@replacechar=N'?'

  • 相关阅读:
    离散数学概论
    Linux内核分析
    程序的本质
    常见bug分析
    java编程思想--学习心得
    领域特定语言--心得
    Linux下网卡配置
    ubuntu下安装python的gevent模块遇到的一个问题
    二分图的最小点覆盖和最大独立集
    win7通过ssh远程登录mininet虚拟机,运行wireshark并通过x11在宿主机显示图形界面
  • 原文地址:https://www.cnblogs.com/roseHLF/p/UpdateStatistics.html
Copyright © 2011-2022 走看看