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: 清空分布式查询的连接缓存
参考文档: