資料庫索引維護雖然重要,但許多 DBA 忽略了「統計資訊」同步更新的必要性。SQL Server 雖提供 AUTO_UPDATE_STATISTICS 選項,但其觸發門檻 (資料變動 20% + 500 筆) 在大型資料表下極易導致統計資訊過期,進而產生糟糕的執行計畫。本文提供一支通用 T-SQL 腳本,可快速為實例上所有使用者資料庫產生 sp_updatestats 指令,解決統計資訊滯後問題。
SQL Server 僅在以下情況自動更新統計資訊:
實務上,大型資料倉庫或高交易量 OLTP 系統,資料變動模式往往不符合上述門檻,導致查詢最佳化器使用過期統計資訊,產生掃描而非索引搜尋等效能災難。
以下腳本使用游標遍歷 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;
sp_updatestats 會自動略過無需更新的統計資訊,僅處理已過期者。
圖一:產生的批次更新指令
實際執行後的輸出範例:
USE [Dummy] EXEC sp_UpdateStats
USE [master] EXEC sp_UpdateStats
USE [msdb] EXEC sp_UpdateStats
...

圖二:執行結果顯示各資料庫統計資訊更新狀態
sp_createstats 建立缺失統計資訊,形成完整維護鏈。UPDATE STATISTICS ... WITH FULLSCAN 取代抽樣,提升準確度。