文章出自: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'?'