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'?'

原文地址:https://www.cnblogs.com/roseHLF/p/UpdateStatistics.html