model 重建| 方法 | 操作方式 | 需重啟 | 控制粒度 | 限制條件 | 適用場景 |
|---|---|---|---|---|---|
| 方法一:修改初始大小並重啟 | ALTER DATABASE MODIFY FILE 指定 SIZE,重啟服務 | ✅ 是 | 檔案層級 (精確控制每個檔案大小) | 需排程維護窗口重啟 | 計劃性容量調整、永久縮減配置 |
| 方法二:DBCC SHRINKDATABASE | 收縮整個 TempDB (資料+日誌) | 視情況 | 資料庫層級 (整體目標大小) | 收縮期間 TempDB 不得有活動;可能因版本存儲/長時間交易失敗 | 緊急回收空間、無法重啟環境 |
| 方法三:DBCC SHRINKFILE | 收縮單一檔案 (資料檔或日誌檔) | 視情況 | 檔案層級 (精確目標大小) | 同方法二,目標檔案不得有活動 | 精準控制特定檔案、多檔案 TempDB |
-- 查看目前 TempDB 檔案配置
USE tempdb;
EXEC sp_helpfile;
-- 修改資料檔初始大小 (例如縮減至 500MB)
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, SIZE = 500MB);
-- 修改日誌檔初始大小 (例如 200MB)
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, SIZE = 200MB);
-- 重啟 SQL Server 服務生效
-- 服務管理器 / SQL Server Configuration Manager / net stop/start mssqlserver
重啟後 TempDB 將依新 SIZE 重建,舊檔案釋放。此方法可永久調整基準大小,避免反覆自動成長碎片化。
-- 目標壓縮至 30% 剩餘空間 (保留 70% 使用空間)
DBCC SHRINKDATABASE (tempdb, 30);
-- 或指定目標大小 (MB)
DBCC SHRINKDATABASE (tempdb, 1024); -- 目標 1GB
⚠ 限制:執行期間 TempDB 不得有任何使用者活動 (含系統背景工作)。實務上極難滿足,常導致收縮失敗或卡住。建議僅在維護窗口、單用戶模式下嘗試。
-- 收縮資料檔至 500MB
DBCC SHRINKFILE (tempdev, 500);
-- 收縮日誌檔至 200MB
DBCC SHRINKFILE (templog, 200);
-- 查看收縮進度
SELECT * FROM sys.dm_exec_requests WHERE command LIKE 'DBCC%';
同樣要求目標檔案期間無活動。多檔案 TempDB 時可針對特定檔案操作。
| 原因 | 現象 | 對策 |
|---|---|---|
| 作用中交易/版本存儲 | 收縮卡住、無進度、錯誤 2556 | 等待交易完成、啟用 RCSI 後需等待版本清理、必要時 KILL 阻塞 SPID |
| 系統物件佔用 (工作表、內部物件) | 資料檔無法釋放頁面 | 重啟服務 (最徹底)、或等待背景工作完成 |
| 檔案已達最小限制 | 無法縮減至指定大小 | 檢查 sp_helpfile 目前大小,調整合理目標 |
| 自動成長增量過小導致碎片 | 反覆成長/收縮產生磁碟碎片 | 設定固定合理增量 (如 256MB/512MB),避免百分比成長 |
FILEGROWTH = 512MB (而非 10%),避免頻繁微幅成長sys.dm_db_file_space_usage:版本存儲、內部物件、使用者物件空間sys.dm_db_task_space_usage:工作階段層級配置/解配置SQLServer:Transactions\Version Cleanup ratesys.dm_db_file_space_usage 判斷佔用類型 (版本存儲/暫存表/工作表)