首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 批次更新所有資料庫統計資訊:解決自動更新不足的實作腳本

     編輯:關於SqlServer

資料庫索引維護雖然重要,但許多 DBA 忽略了「統計資訊」同步更新的必要性。SQL Server 雖提供 AUTO_UPDATE_STATISTICS 選項,但其觸發門檻 (資料變動 20% + 500 筆) 在大型資料表下極易導致統計資訊過期,進而產生糟糕的執行計畫。本文提供一支通用 T-SQL 腳本,可快速為實例上所有使用者資料庫產生 sp_updatestats 指令,解決統計資訊滯後問題。

一、 為何不能只仰賴自動更新統計資訊?

SQL Server 僅在以下情況自動更新統計資訊:

  • 資料從空表新增第一筆資料時
  • 資料表筆數 > 500,且前導欄位變動超過 500 次
  • 資料表筆數 > 500,且前導欄位變動超過 20% + 500 筆

實務上,大型資料倉庫或高交易量 OLTP 系統,資料變動模式往往不符合上述門檻,導致查詢最佳化器使用過期統計資訊,產生掃描而非索引搜尋等效能災難。

二、 通用批次產生腳本 (相容 SQL 7.0 以上版本)

以下腳本使用游標遍歷 sysdatabases,排除 model、tempdb,為每個資料庫產生 USE [DB] EXEC sp_updatestats 指令:

DECLARE @SQL VARCHAR(1000), @DB sysname;
DECLARE curDB CURSOR FORWARD_ONLY STATIC FOR
SELECT [name] FROM sys.sysdatabases
WHERE [name] NOT IN ('model', 'tempdb')
ORDER BY [name];

OPEN curDB;
FETCH NEXT FROM curDB INTO @DB;
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'USE [' + @DB + ']' + CHAR(13) + 'EXEC sp_updatestats' + CHAR(13);
    PRINT @SQL;
    FETCH NEXT FROM curDB INTO @DB;
END
CLOSE curDB;
DEALLOCATE curDB;

三、 執行流程與驗證

  1. 執行上述腳本,訊息 頁籤將列出所有資料庫的更新指令。
  2. 複製輸出結果,貼上至新查詢視窗執行。
  3. 觀察輸出訊息:sp_updatestats 會自動略過無需更新的統計資訊,僅處理已過期者。

腳本產生的更新指令清單

圖一:產生的批次更新指令

實際執行後的輸出範例:

USE [Dummy] EXEC sp_UpdateStats
USE [master] EXEC sp_UpdateStats
USE [msdb] EXEC sp_UpdateStats
...

執行更新統計資訊結果

圖二:執行結果顯示各資料庫統計資訊更新狀態

四、 最佳實務建議

  • 建立 SQL Agent 作業,排程每日/每週非尖峰時段執行。
  • 搭配 sp_createstats 建立缺失統計資訊,形成完整維護鏈。
  • 大型資料庫建議使用 UPDATE STATISTICS ... WITH FULLSCAN 取代抽樣,提升準確度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved