Sql-Server
編寫“終極數據庫維護腳本”
我正在嘗試編寫 T-SQL 腳本,它將:
A) 將數據庫大小縮小到可能的最小大小;B) 進行完整性檢查,對數據庫進行徹底的“重組”和優化,使其處於“新鮮”狀態。
這是我目前擁有的:
-- Check database integrity: DBCC CHECKDB WITH NO_INFOMSGS; GO -- Get space usage information: EXEC sp_spaceused @updateusage = N'TRUE'; GO -- Shrink database: DBCC SHRINKDATABASE (0, 0); GO -- Reindex all tables: EXEC sp_msforeachtable N'PRINT ''Indexing table: ?''; DBCC DBREINDEX (''?'');' GO -- Update statistics for all tables: EXEC sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN' GO -- Clear procedure cache: DBCC FREEPROCCACHE; GO -- Update all usage info in the database: DBCC UPDATEUSAGE (0); GO
您能否驗證所有這些是否正確?命令的優先級(例如索引重建後更新統計資訊,反之亦然)、語法、參數等都是最優的?你能建議任何其他命令嗎?性能不是問題,我可能每月執行一次這個腳本,晚上時間,所以即使需要幾個小時也沒關係。我只需要數據庫的最大優化。任何投入將不勝感激。
謝謝!
恐怕您的腳本中充斥著對數據庫如何工作的誤解,至少在 SQL Server 中是這樣。
- 首先,使用通用的 DBCC SHRINKDATABASE 命令盡可能地收縮數據庫。為什麼?如果數據庫要再次增長,您通過縮小文件獲得了什麼?您是否要在此期間臨時租用該空間,直到數據庫再次需要它?這將導致碎片化並使您的重新索引工作更加努力。稍後會詳細介紹。
- 接下來,無論它們是否需要,您都重新索引所有表。通常最好先分析表,並在必要時對特定索引執行條件操作(例如重組或重建)。
- 由於您正在重建所有索引,並且索引重建需要 - 平均 - 索引佔用的空間的 1.5 倍,您認為它將從哪裡獲得該空間?您剛剛縮小了數據庫,因此沒有可用空間。您無緣無故地縮小了數據庫,因為現在它必須增長以提供一些空間來容納索引重建。
- 然後使用全掃描更新統計資訊。您剛剛重建了所有索引。您認為此時更新統計數據是必要的還是有幫助的?我沒有,因為重建索引會自動更新其統計資訊。所以這個額外的步驟只是浪費。
- 最後,清除整個 proc 記憶體不太可能導致整體性能提升。可能是您在一些查詢中得到了改進,但是恕我直言,將它們嗅出並單獨清除它們會更有效(您可以在現代版本的 SQL Server 中手動清除計劃,而不會把嬰兒扔出去)洗澡水)。
我不得不說,到目前為止,您所獲得的遠非最佳,並且有更好的解決方案可以幫助您以更有效和更少浪費的方式優化數據庫。查看Ola 的解決方案、SQLFool 的解決方案和SQL Sentry。這些不會縮小您的數據庫,但它們會以一種智能的方式優化您的索引,無論如何您都不應該縮小您的數據庫。
去這裡,下載/安裝腳本。
如果這是用於生產,我強烈建議您不要自己編寫腳本。使用已經過徹底測試的腳本集而不是重新發明輪子要好得多(也更容易!)。