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
- DBCC CHECKALLOC
- DBCC CHECKCATALOG
- DBCC CHECKTABLE
DBCC CHECKDB 的用法,可以參考《Could not continue scan with NOLOCK due to data movement》
2,檢查限制的完整性
- DBCC CHECKCONSTRAINTS
3,檢查檔案的完整型
- DBCC CHECKFILEGROUP
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
- DBCC TRACEOFF
- DBCC TRACEON
檢視追蹤狀态
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: 清空分布式查詢的連接配接緩存