DBCC是SQL Server的數據庫控制台命令(Database Console Command)的簡寫,主要分為維護、信息、驗證和其他共四類。
一,維護
DBCC 可以回收空間、收縮數據庫,更新系統視圖中的頁面數量和行數量。
1,回收空間
從表或索引視圖中的被刪除的可變長度列(variable-length column)中回收空間,該命令不會從已被刪除的固定長度的列(fix-length column)中回收空間。
DBCC CLEANTABLE ( { database_name | database_id | 0 } , { table_name | table_id | view_name | view_id } [ , batch_size ] ) [ WITH NO_INFOMSGS ]
batch_size是指每個事務處理的數據行數量,默認值是0,表示在一個事務中處理整個表。
2,數據庫收縮
DBCC SHRINKDATABASE,用於收縮數據庫的數據文件和日志文件, DBCC SHRINKFILE,用於收縮數據庫中指定的單個文件,或者清空單個文件。
DBCC SHRINKDATABASE ( database_name | database_id | 0 [ , target_percent ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ) [ WITH NO_INFOMSGS ] DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ] } ) [ WITH NO_INFOMSGS ]
3,更新視圖中的頁面數量和行數量
該命令用於校正表或索引中每個分區的行、已用頁,保留頁,葉級頁和數據頁的數量,使得 sp_spaceused 等系統存儲過程或視圖返回的結果更精確。
DBCC UPDATEUSAGE ( { database_name | database_id | 0 } [ , { table_name | table_id | view_name | view_id } [ , { index_name | index_id } ] ] ) [ WITH [ NO_INFOMSGS ] [ , ] [ COUNT_ROWS ] ]
二,信息
信息類DBCC主要輸出信息。
1,查看最新的語句
顯示從客戶端發送到Microsoft SQL Server實例的最后一條語句。
DBCC INPUTBUFFER ( session_id [ , request_id ]) [WITH NO_INFOMSGS ]
2,查看活躍事務
DBCC OPENTRAN [ ( [ database_name | database_id | 0 ] ) { [ WITH TABLERESULTS ] [ , [ NO_INFOMSGS ] ] } ]
3,查看日志空間,重置wait和latch的統計
DBCC SQLPERF ( [ LOGSPACE ] | [ "sys.dm_os_latch_stats" , CLEAR ] | [ "sys.dm_os_wait_stats" , CLEAR ] ) [WITH NO_INFOMSGS ]
4,查看當前連接的SET選項
DBCC USEROPTIONS [ WITH NO_INFOMSGS ]
5,查看表或索引視圖的統計信息
DBCC SHOW_STATISTICS 用於顯示表或索引視圖的統計信息,查詢優化器使用統計信息來評估查詢結果的大小和基數。
DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target ) [ WITH [ NO_INFOMSGS ] < option > [ , n ] ] < option > :: = STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM
三,驗證
驗證類DBCC 主要用於檢查數據的完整性、約束的完整性、文件的完整性,並可以查看和設置ID列的值。
1,檢查數據的完整性
DBCC CHECKDB 的用法,可以參考《Could not continue scan with NOLOCK due to data movement》
2,檢查約束的完整性
3,檢查文件的完整型
4,查看當前表的ID值
DBCC CHECKIDENT,用於查看當前表的ID值,或者為當前表設置一個新的ID值(即重置ID種子值)
DBCC CHECKIDENT ( table_name [, { NORESEED | { RESEED [, new_reseed_value ] } } ] ) [ WITH NO_INFOMSGS ]
四,追蹤(TRACE)
打開Trace,關閉trace,查看trace的狀態:
查看追蹤狀態
DBCC TRACESTATUS ( [ [ trace# [ ,...n ] ] [ , ] [ -1 ] ] )
[ WITH NO_INFOMSGS ]
五,碎片
SQL Server按照特定的順序來存儲數據,如果數據葉被移動或拆分,會導致碎片的產生。
1,顯示表或索引的碎片信息
該命令將被移除,推薦使用 sys.dm_db_index_physical_stats 替換。
DBCC SHOWCONTIG [ ( { table_name | table_id | view_name | view_id } [ , index_name | index_id ] ) ] [ WITH { [ , [ ALL_INDEXES ] ] [ , [ TABLERESULTS ] ] [ , [ FAST ] ] [ , [ ALL_LEVELS ] ] [ NO_INFOMSGS ] } ]
2,索引碎片的重組和重建
DBCC INDEXDEFRAG 用於索引碎片的重組,該命令將被移除,推薦使用 ALTER INDEX REORGANIZE 替代
DBCC DBREINDEX 用於索引碎片的重建,該命令將被移除,推薦使用 ALTER INDEX REBUILD替代
六,緩存
SQL Server的緩存池分為數據緩存和計划緩存,數據緩存用於存儲數據,而計划緩存用於存儲執行計划等信息。
1,查看過程緩存(plan cache)
DBCC PROCCACHE [ WITH NO_INFOMSGS ]
2,移除緩存
DBCC DROPCLEANBUFFERS 用於移除緩存池中的clean buffer,為了刪除clean buffer,首先調用CHECKPOINT,把所有的臟數據頁寫回到硬盤中,此時的緩存不存在任何臟數據庫,稱作 clean buffer。
DBCC FREEPROCCACHE 用於移除緩存池中的plan cache,或者移除資源池中的緩存項目。
DBCC FREESYSTEMCACHE 從所有緩存中移除沒有使用的緩存項目(unused cache entries),SQL Server在后台會自動清空未使用的緩存項目,也可以手動指定命令從每個緩存或Resource Governor的資源池中移除未使用的項目。
DBCC DROPCLEANBUFFERS [ WITH NO_INFOMSGS ] DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ] DBCC FREESYSTEMCACHE ( 'ALL' [, pool_name ] ) [WITH { [ MARK_IN_USE_FOR_REMOVAL ] , [ NO_INFOMSGS ] } ]
pool_name 是Resource Governor的資源池名稱,可以從 sys.dm_resource_governor_resource_pools 獲得資源池名稱。
3,移除其他緩存
DBCC FLUSHAUTHCACHE : 移除數據驗證緩存,清空login和firewall 規則
DBCC FREESESSIONCACHE: 清空分布式查詢的連接緩存
參考文檔: