http://blog.163.com/ruifeng_00/blog/static/6904584200971291923462/
一、定义
微软当初从SYBASE将DBCC是作为数据库一致性检查(Database Consistency Check)命令扩展过来的,但经过后来的扩展,DBCC命令的功能范围增大,现在称之为数据库控制台命令(Database Console Command)。
二、公开的DBCC命令
2.1验证类
对数据库、文件组、表、索引、数据库页的分配、系统目录进行的验证操作。
DBCC CHECKDB
对索引结构和数据完整性进行检查之外,它还包括对分配进行检查、对数据存储中使用的页信息进行验证。
仿佛是对数据库执行 DBCC CHECKALLOC 语句和每个表执行DBCC CHECKTABLE 语句。
DBCC CHECKFILEGROUP
对数据库中的所有文件组执行 DBCC CHECKFILEGROUP 语句与运行单个 DBCC CHECKDB 语句相同。唯一的差别在于:如果表的索引在不同文件组上,则将多次检查该表和索引(对包含表或其索引的每个文件组检查一次)。
DBCC CHECKTABLE
对表或索引视图的数据、索引及 text、ntext 和 image 页的完整性检查。
包括:
索引和数据页是否已正确链接。
索引是否按照正确的顺序排列。
各指针是否一致。
每页上的数据是否均合理。
页面偏移量是否合理。
text、ntext 和 image 页的链接及大小进行检查。
DBCC CHECKALLOC
对数据库中所有数据页的分配进行验证。
默认情况下,DBCC CHECKALLOC 不获取表锁。相反,它获取架构锁,该锁在 DBCC CHECKALLOC 正在执行时阻止对元数据(即DDL)进行更改,但允许更改数据(即DML)。
DBCC NEWALLOC
等同于 DBCC CHECKALLOC,为了向后兼容。
注:
(1)以上DBCC 语句收集信息,然后扫描日志以查找所做的任何其它更改,并在扫描的结尾将两组信息合并在一起以产生数据的一致性检查视图;
(2)DBCC往往大量占用 CPU 及磁盘,因为 DBCC 必须读取每个数据页,而这需要从磁盘到内存全都检查一遍(除非数据页已高速缓存到内存中)。当系统上有许多活动而运行 DBCC 时,系统活动和DBCC的性能都会被削弱。在SQL SERVER 2005以后,在执行这些 DBCC 命令之一时,数据库引擎创建一个数据库快照,并将其置于在事务上一致的状态,以防止在执行这些命令时出现阻塞和并发问题。然后,DBCC 命令对该快照运行检查。DBCC 命令完成后,将删除该快照。(在无法创建快照的情况下,或指定了TABLOCK,则DBCC将获取一个共享表锁来获得所需的一致性,也就是说并不能保证DBCC完全摆脱阻塞的可能。)
DBCC CHECKCATALOG
对 syscolumns 中的每种数据类型在 systypes 中是否都有一个匹配项进行检查,同时还对 sysobjects 中的每个表和视图在 syscolumns 中是否都至少有一列进行检查。
DBCC CHECKCONSTRAINTS
对表的所有外键约束和检查约束的查询(针对可通过ALTER TABLE启用/禁用的约束)。
DBCC CHECKIDENT
检查指定表的当前标识值,如有必要,还对标识值进行更正。
注:几种标识列的维护方法
DBCC CHECKIDENT('tablename',RESEED,1)
--清表后会自动回到原始
TRUNCATE TABLE tablename
--新增列
ALTER TABLE tablename ADD newcolname INT IDENTITY(1,1) not null
--设置选项就可以insert自定义的id值了
SET IDENTITY_INSERT Tablename ON
2.2、查看类
DBCC OPENTRAN
查看日志中的活动事务(即未COMMIT或ROLLBACK的TRAN)。
DBCC INPUTBUFFER
返回指定SESSION在SQL SERVER中的最后一条语句,这里的BUFFER应该指的是BUFFER POOL中的PROC CACHE,即保存SQL语句、过程及执行计划的地方。此返回结果可用于对某个会话的跟踪。
DBCC OUTPUTBUFFER
以十六进制或 ASCII 格式返回指定的SESSION中最后一条语句的输出数据(如果有输出流的话,比如SELECT语句)。
DBCC PROCCACHE
以表格格式显示有关过程缓存区的信息。SQL Server 性能监视器使用 DBCC PROCCACHE 以获得有关过程高速缓存的信息。
DBCC SHOWCONTIG
显示指定的表的数据和索引的碎片信息。通常依此判断是否需要对索引进行维护。在2005及以后的版本中请改用 sys.dm_db_index_physical_stats。
DBCC SHOW_STATISTICS
返回的统计结果指明索引的选择性(所返回的密度越低,选择性越大),并提供用于确定索引对查询优化器是否有用的基本信息。所返回的结果基于索引的分发步骤。若要查看更新统计的最近日期,请使用STATS_DATE()。
DBCC SQLPERF
返回当前实例中所有数据库的日志使用率。可以自己根据每个数据库中sysfiles里的size和maxsize算出这个比例。
DBCC TRACESTATUS
返回跟踪标记号列和状态列,指明跟踪标记是 ON (1) 还是 OFF (0)。
DBCC USEROPTIONS
返回当前会话的SET选项,每自定义一个SET在结果集中即为返回,未返回的项表示未进行自定义设置,即使用默认设置。也可以使用SESSIONPROPERTY()查询会话中某个SET的设置。
DBCC CONCURRENCYVIOLATION
显示有关在 SQL Server 2000 Desktop Engine 或 SQL Server 2000 个人版上并发执行 5 个以上批处理的次数的统计。
2005及以后此命令已是无效命令。
2.3、维护类
DBCC INDEXDEFRAG
对表或视图上的索引的叶级进行碎片整理,以便页的物理顺序与叶节点从左到右的逻辑顺序相匹配,从而提高索引扫描性能。
2005中使用ALTER INDEX的REORGANIZE选项代替此命令。
DBCC DBREINDEX
重建表的某个或全部索引。
2005中使用ALTER INDEX的REBUILD选项代替此命令。
DBCC SHRINKDATABASE
以每个文件为单位,对指定数据库的所有数据和日志文件收缩未使用空间:包括已删除的数据、文件自动增长所未使用的空间及其一些不能被使用的碎片空间,这些未使用空间可通过sp_sapceused得到。执行命令后将分配页从文件末尾移动到文件前部的未分配页,然后进行压缩,只有指定了TRUNCATEONLY选项,才会将空间释放给操作系统。
注:
1、DBCC SHRINKDATABASE仅仅是将空间给收缩了,并没有对数据或索引做碎片整理,所以并不会带来性能上的改观;
2、在产生许多未使用空间的操作(如截断表、日志或删除表)后,执行收缩操作最有效,产生碎片较少。过度频繁使用,不仅影响数据库的正常运行,还会增加数据库的碎片程度。
DBCC SHRINKFILE
收缩相关数据库的指定数据文件或日志文件,一次一个。
DBCC DROPCLEANBUFFERS
从缓冲池中清除数据缓冲区中的内容,而不用关闭和重新启动服务器。在进行查询优化时,可用此方法来生成各种所需的执行计划。
DBCC FREEPROCCACHE
从缓冲池中清除过程缓冲区中的内容,以强制执行计划的重编译。
DBCC UPDATEUSAGE
报告和更正sysindexes 表的不正确内容,可能会导致sp_spaceused 产生不正确的空间使用报表。
DBCC CLEANTABLE
收回用 ALTER TABLE DROP COLUMN 语句除去可变长度列或 text 列后的空间。而不收回固定长度列除去后的空间。
DBCC DBREPAIR
除去损坏的数据库,为了向后兼容,请使用DROP DATABASE来删除。
2.4、其他
DBCC ROWLOCK
对表启用插入行锁定 (IRL) 操作。SQL SERVER默认启用行级锁定,并可能提升为页或表锁定。
2000 及以后此命令已是无效命令。
DBCC PINTABLE
将表标记为驻留,当表中的页由普通的 Transact-SQL 语句读入到高速缓存中时,这些页将标记为内存驻留页。
适用于将小的、经常引用的表保存在内存中。将小表的页一次性读入到内存中,将来对其数据的所有引用都不需要从磁盘读入。
如果驻留大表,则该表在开始时会使用一大部分高速缓存,而不为系统中的其它表保留足够的高速缓存。如果所驻留的表比高速缓存大,则该表会填满整个高速缓存。
查看哪个表是否驻留在内存的方法是:
select objectproperty(object_id('tablename'),‘tableispinned')
2005及以后此命令已是无效命令。
DBCC UNPINTABLE
将表标记为不在内存驻留,不会导致立即将表从数据高速缓存中清空。而指定如果需要空间以从磁盘中读入新页,高速缓存中的表的所有页都可以清空。
2005及以后此命令已是无效命令。
DBCC HELP
显示DBCC命令的语法。
DBCC dllname (FREE)
当执行扩展存储过程时,DLL 仍保持由 SQL Server 的实例加载,直到关闭服务器为止。此语句允许从内存中卸载 DLL,而不用关闭 SQL Server。Dllname指定扩展存储过程的dll文件名。执行 sp_helpextendedproc 以显示当前由 SQL Server 装载的 DLL 文件。
DBCC TRACEON
启用指定的跟踪标记。跟踪标记用于临时设置服务器的特定特征或关闭特定行为。
DBCC TRACEOFF
禁用指定的跟踪标记。
三、未公开的DBCC命令
注:
既然是未公开的,那么就不要在开发环境中使用,没有人会对可能出现的问题负责。但作为对于SQL SERVER的学习工具,还是可以一用的。
3.1、性能
事实上我们可以通过性能监视器来获得类似的信息,但可能没有结果集来得更具体。
DBCC SQLPERF
以下是SQLPERF的一些Undocumented的参数:
DBCC SQLPERF(UMSSTATS) 提供有关sql server 线程管理情况的统计信息,可以用来检查是否CPU使用达到瓶颈,最关键的一个参考数据num runnable,表明当前有多少个线程再等待运行,如果大于等于2,考虑CPU达到瓶颈
DBCC SQLPERF(WAITSTATS):提供有关SQL Server read-ahead activity的信息
DBCC SQLOERF(IOSTATS):提供主要的SQL server读和写的信息
DBCC SQLPERF(RASTATS):提供SQL Server read-ahead 活动的信息
DBCC SQLPERF(THREADS):提供每个SQL Server线程的I/O,CPU及内存使用情况的信息。
DBCC CACHESTATS
显示SQL Server缓冲区的统计信息,如命中率、使用内存页数等
DBCC CURSORSTATS
显示SQL Server游标使用时的统计信息
DBCC MEMORYSTATUS
列出一个详细分类,分类中显示SQL SERVER缓存如何分配,包括缓存的活动。
DBCC SQLMGRSTATS
显示SQL SERVER缓冲中先读和预读准备的SQL语句
3.2、存储引擎
详见:Some Useful Undocumented SQL Server 7.0 and 2000 DBCC Commands
以下DBCC命令需要打开3604标记,否则命令运行成功,但不会看到结果。
DBCC TRACEON (3604)
DBCC ERRORLOG
初始化SQL Server的错误日志文件,使用这个命令,可以截断当前的服务器日志(不要理解成数据库日志文件),主要是生成一个新的服务器日志。可以考虑设置一个调度任务,每周执行这个命令自动截断服务器日志。
使用存储过程sp_cycle_errorlog也可以达到同样的目的。
DBCC PSS (user,spid,1)
显示当前连接到SQL Server服务器的进程信息
DBCC RESOURCE
显示服务器当前使用的资源情况
DBCC DBINFO (db_name)
显示数据库的结构信息
DBCC DBTABLE
显示管理数据的表(数据字典)信息
DBCC IND (db_name,table_name,index_id)
查看某个索引页面信息,事实上查看聚焦索引页面就是查看数据页面
DBCC PRTIPAGE
查看某个索引页面的每行指向的页面号
DBCC PAGE(db_name,pagenum)
查看某个数据页面信息
DBCC TAB (db_id,object_id)
查看某个表的所有数据页面的信息
DBCC LOG (db_name,3) (-1~4)
查看某个数据库使用的事物日志信息
DBCC REBUILDLOG
重建SQL Server事务日志文件,可以用在还原无日志数据文件时重建一个初始日志
DBCC BUFFER (db_name,object_name,int(要查看的缓冲区个数))
显示缓冲区的头部信息和页面信息
DBCC PROCBUF
显示过程缓冲池中的缓冲区头和存储过程头
DBCC FLUSHPROCINDB (db_id)
清除SQL Server服务器内存中的某个数据库的存储过程缓存内容
DBCC BYTES ( startaddress, length )
从给定的内存地址清空指定长度的字节数,这个功能还是不要用的比较好。