DBCC (Database Console Commands) 是 SQL Server 診斷、維護、驗證的瑞士軍刀。本文系統整理四大類 DBCC 命令,提供標準語法、關鍵參數、實戰場景與避坑指南,作為 DBA 桌邊速查手冊 (上篇:維護、驗證、資訊、雜項)。
| 類別 | 用途 | 代表命令 |
|---|---|---|
| 維護 | 資料庫/索引/檔案群組物理重組、空間回收、快取清理 | INDEXDEFRAG, DBREINDEX, SHRINKDATABASE, SHRINKFILE, CLEANTABLE, DROPCLEANBUFFERS, FREEPROCCACHE, UPDATEUSAGE |
| 驗證 | 邏輯/物理一致性檢查、配置頁/目錄/約束/身分識別值驗證 | CHECKDB, CHECKTABLE, CHECKALLOC, CHECKFILEGROUP, CHECKCATALOG, CHECKIDENT, CHECKCONSTRAINTS |
| 資訊 | 統計資訊、輸入緩衝區、碎片度、開啟交易、快取狀態顯示 | SHOW_STATISTICS, INPUTBUFFER, SHOWCONTIG, OPENTRAN, PROCCACHE, SQLPERF |
| 雜項 | 追蹤旗標、DLL 卸載、修復選項等 | TRACEON/OFF, FREESESSIONCACHE, HELP |
-- 線上碎片整理 (Enterprise/Standard 2012+),低鎖定,適合維護窗口
DBCC INDEXDEFRAG (db_id, table_id, index_id, partition_number) WITH NO_INFOMSGS;
-- 離線/線上重建索引 (填充因子可調),重建統計資訊,效果徹底
DBCC DBREINDEX ('table_name', 'index_name', fillfactor) WITH NO_INFOMSGS;
-- 現代替代: ALTER INDEX ... REBUILD/REORGANIZE
-- 回收變長欄位 (varchar/varbinary/LOB) 刪除後的空間
DBCC CLEANTABLE (db_id, 'table_name', batch_size) WITH NO_INFOMSGS;
-- 資料庫/檔案壓縮 (謹慎使用,易產生碎片)
DBCC SHRINKDATABASE (db_id, target_percent, NOTRUNCATE|TRUNCATEONLY) WITH NO_INFOMSGS;
DBCC SHRINKFILE (file_id, target_size, NOTRUNCATE|TRUNCATEONLY) WITH NO_INFOMSGS;
-- 最佳實踐: 固定初始大小/成長量,僅異常暴增後一次性壓縮並鎖定大小
-- 清除乾淨緩衝區 (測試冷快取效能用)
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
-- 清除程序快取 (重新編譯所有計畫)
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
-- 修正系統目錄中頁數/行數不準 (大量匯入/截斷後)
DBCC UPDATEUSAGE (db_id, 'table_name', 'index_name') WITH COUNT_ROWS, NO_INFOMSGS;
-- 完整檢查:配置頁 + 表/索引結構 + 邏輯一致性 (最全面,耗時最長)
DBCC CHECKDB (db_id) WITH ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY, PHYSICAL_ONLY, DATA_PURITY;
-- 單表檢查 (可指定索引、修復選項)
DBCC CHECKTABLE ('table_name') WITH NOINDEX | REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD, ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY, PHYSICAL_ONLY;
-- 檔案群組檢查 (大型資料庫分區檢查)
DBCC CHECKFILEGROUP (filegroup_id) WITH NOINDEX, ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY;
| 選項 | 行為 | 資料遺失風險 | 適用場景 |
|---|---|---|---|
| REPAIR_FAST | 僅修復快速可修復的輕微錯誤 (如位圖) | 極低 | 首選嘗試 |
| REPAIR_REBUILD | 重建索引、修復非叢集索引錯誤 | 低 | 無備份時次選 |
| REPAIR_ALLOW_DATA_LOSS | 刪除損壞頁/資料列以恢復一致性 | 極高 | 最後手段,必先完整備份 |
-- 目錄一致性 (系統表元數據)
DBCC CHECKCATALOG (db_id) WITH NO_INFOMSGS;
-- 身分識別值檢查/重設
DBCC CHECKIDENT ('table_name', NORESEED | RESEED, new_reseed_value) WITH NO_INFOMSGS;
-- 約束完整性 (FK/CK)
DBCC CHECKCONSTRAINTS ('table_name', 'constraint_name') WITH ALL_CONSTRAINTS, ALL_ERRORMSGS, NO_INFOMSGS;
-- 磁碟空間配置結構
DBCC CHECKALLOC (db_id) WITH NOINDEX, REPAIR_ALLOW_DATA_LOSS|REPAIR_FAST|REPAIR_REBUILD, ALL_ERRORMSGS, NO_INFOMSGS, TABLOCK, ESTIMATEONLY;
-- 索引/欄位統計資訊詳細內容 (直方圖、密度向量、選擇率)
DBCC SHOW_STATISTICS ('table_name', 'index_name');
-- 顯示指定 SPID 最後一條客戶端指令 (排查阻塞/長查詢)
DBCC INPUTBUFFER (session_id, request_id) WITH NO_INFOMSGS;
-- 顯示表/索引碎片資訊 (掃描密度、邏輯/程度碎片、頁面密度)
DBCC SHOWCONTIG ('table_name', 'index_name') WITH TABLERESULTS, FAST, ALL_INDEXES, ALL_LEVELS, NO_INFOMSGS;
-- 現代替代: sys.dm_db_index_physical_stats
-- 顯示最早作用中交易/複寫交易資訊
DBCC OPENTRAN (db_id) WITH TABLERESULTS, NO_INFOMSGS;
PHYSICAL_ONLY 僅做物理頁面檢查 (大幅縮短時間)。DBCC FREESYSTEMCACHE('SQL Plans') 或 sp_recompile 單表/預存程序。DATA_PURITY (驗證資料型別有效性)、PHYSICAL_ONLY、TABLOCK (加速檢查) 等選項,舊版本語法需查閱對應版本線上叢書。下篇將深入實戰場景:阻塞排查、死鎖分析、TempDB 壓力、Always On 同步延遲、效能基線建立中的 DBCC 組合拳應用。