DBCC命令2:状态查询
状态查询:收集和显示各类信息,状态检查。
如cachestats、pss、sqlmgrstats、memorystatus、proccache、freeproccache、freesystemcache、freesessioncache、dropcleanbuffers、flushprocindb、inputbuffer、outputbuffer、cursorstats等。
1、DBCC CACHESTATS:显示SQL Server2000中高速缓存中各种对象的数量与高速缓存的命中率,命中率越高越好,在SQL Server 2008中不再支持。
DBCC PSS :显示当前连接到SQL Server 2000服务器的进程信息,在SQL Server 2008中不再支持。
2、 DBCC SQLMGRSTATS:用于产生3个不同的值,这些值用在你想查看高速缓存在ad-hoc和预编译的TSQL语句中是如何工作的。
返回值说明:
Memory Used(8K Pages):若内存页的数量非常大,这也许表明一些用户连接正在预处理许多T-SQL语句。
Number CSql Objects:表明已经在高速缓存中的T-SQL的语句的总数
Number False Hits:有时,当sql server匹配在高速缓存中已经存在的T-SQL语句时会出现错误的命中。在理想的情况下,这个数字应该尽可能地小。
3、DBCC MEMORYSTATUS:列出各项SQL Server内存缓存区的使用情况。
返回了大量的有关内存方面的信息,在动态性能视图sys.dm_os_memory_clerks中有类似的信息。
4、DBCC PROCCACHE:显示过程的执行计划高速缓存的使用情况。
返回值中前3个是显示了个数,后3个是:
列名 | 描述 |
---|---|
num proc buffs | 过程高速缓存中可能有的存储过程数。 |
num proc buffs used | 容纳存储过程的高速缓存槽数。 |
num proc buffs active | 容纳正在执行的存储过程的高速缓存槽数。 |
proc cache size | 过程高速缓存的总大小。 |
proc cache used | 容纳存储过程的过程高速缓存量。 |
proc cache active | 容纳正在执行的存储过程的过程高速缓存量。 |
5、DBCC FREEPROCCACHE:
删除计划缓存中的所有元素,通过指定计划句柄或 SQL 句柄从计划缓存中删除特定计划,或者删除与指定资源池相关联的所有缓存条目。
DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ]
参数
- ( { plan_handle | sql_handle |pool_name } )
-
plan_handle 用于唯一标识已执行并且其计划驻留在计划缓存中的批处理的查询计划。plan_handle 的数据类型为varbinary(64),可从下列动态管理对象中获得此参数:
- sys.dm_exec_cached_plans
- sys.dm_exec_requests
- sys.dm_exec_query_memory_grants
- sys.dm_exec_query_stats
sql_handle 是要清除的批处理的 SQL 句柄。sql_handle 的数据类型为varbinary(64),可从下列动态管理对象中获得此参数:
- sys.dm_exec_query_stats
- sys.dm_exec_requests
- sys.dm_exec_cursors
- sys.dm_exec_xml_handles
- sys.dm_exec_query_memory_grants
pool_name 是资源调控器资源池的名称。pool_name 的数据类型为sysname,可通过查询 sys.dm_resource_governor_resource_pools 动态管理视图获得此参数。
若要将资源调控器工作负荷组与资源池相关联,请查询 sys.dm_resource_governor_workload_groups 动态管理视图。有关会话的工作负荷组的信息,请查询 sys.dm_exec_sessions 动态管理视图。
- WITH NO_INFOMSGS
-
禁止显示所有信息性消息。
结果集
如果未指定 WITH NO_INFOMSGS 子句,DBCC FREEPROCCACHE 将返回:
“DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。”
注释
小心使用 DBCC FREEPROCCACHE 清除计划缓存。例如,释放计划缓存将导致系统重新编译存储过程,而不重用缓存中的存储过程。这会导致查询性能暂时性地突然降低。对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志将包含以下信息性消息:“由于 'DBCC FREEPROCCACHE' 或 'DBCC FREESYSTEMCACHE' 操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新。”只要每五分钟刷新一次缓存,此消息就将每五分钟记录一次。
权限:
需要对服务器拥有 ALTER SERVER STATE 权限。
示例
A. 从计划缓存中清除查询计划
以下示例通过指定查询计划句柄从计划缓存中清除查询计划。为了确保示例查询在计划缓存中,首先执行该查询。将查询sys.dm
_exec
_cached_plans
和sys.dm
_exec
_sql
_text
动态管理视图以返回查询的计划句柄。然后,将结果集中的计划句柄值插入DBCC
FREEPROCACHE
语句,以从计划缓存中仅删除该计划。
USE AdventureWorks2008R2;
GO
SELECT * FROM Person.Address;
GO
SELECT plan_handle, st.text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE text LIKE N'SELECT * FROM Person.Address%';
GO
|
下面是结果集:
plan_handle text
-------------------------------------------------- -----------------------------
0x060006001ECA270EC0215D05000000000000000000000000 SELECT * FROM Person.Address;
(1 row(s) affected)
-- Remove the specific plan from the cache.
DBCC FREEPROCCACHE (0x060006001ECA270EC0215D05000000000000000000000000);
GO
|
B. 清除计划缓存中的所有计划
以下示例清除计划缓存中的所有元素。指定了 WITH NO_INFOMSGS
子句来阻止显示信息消息。
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
|
C. 清除与资源池相关联的所有缓存条目
以下示例清除与指定资源池相关联的所有缓存条目。sys.dm_resource_governor_resource_pools
视图首先被查询,以便获取pool_name 的值。
SELECT * FROM sys.dm_resource_governor_resource_pools;
GO
DBCC FREEPROCCACHE ('default');
GO
|
6、DBCC FREESYSTEMCACHE:
从所有缓存中释放所有未使用的缓存条目。SQL Server 数据库引擎会事先在后台清理未使用的缓存条目,以使内存可用于当前条目。但是,可以使用此命令从所有缓存中或者从指定的资源调控器池缓存中手动删除未使用的条目。
DBCC FREESYSTEMCACHE
( 'ALL' [, pool_name ] )
[WITH
{ [ MARK_IN_USE_FOR_REMOVAL ] , [ NO_INFOMSGS ] }
]
参数
- ( 'ALL' [, pool_name ] )
-
ALL 指定所有受支持的缓存。
pool_name 指定资源调控器池缓存。只释放与此池关联的条目。
- MARK_IN_USE_FOR_REMOVAL
-
当不再使用当前使用的条目后,将它们分别从其各自所属的缓存中进行异步释放。当 DBCC FREESYSTEMCACHE WITH MARK_IN_USE_FOR_REMOVAL 执行后,缓存中新创建的条目不会受到影响。
- NO_INFOMSGS
-
禁止显示所有信息性消息。
结果集
DBCC FREESYSTEMCACHE 返回:“DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。”
注释
执行 DBCC FREESYSTEMCACHE 将清除 SQL Server 实例的计划缓存。清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志将包含以下信息性消息:“由于 'DBCC FREEPROCCACHE' 或 'DBCC FREESYSTEMCACHE' 操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新。”只要每五分钟刷新一次缓存,此消息就将每五分钟记录一次。
权限
需要对服务器的 ALTER SERVER STATE 权限。
示例
A. 从资源调控器池缓存释放未使用的缓存条目
下面的示例说明如何清除专属于某个指定资源调控器资源池的缓存。
-- Clean all the caches with entries specific to the resource pool named "default".
DBCC FREESYSTEMCACHE ('ALL','default');
|
B. 当不再使用条目后,将它们分别从其各自所属的缓存中释放
下面的示例使用 MARK_IN_USE_FOR_REMOVAL 子句,在不再使用条目后将它们从所有当前缓存中释放。
DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;
|
7、DBCC FREESESSIONCACHE:
刷新针对 Microsoft SQL Server 实例执行的分布式查询所使用的分布式查询连接缓存。
DBCC FREESESSIONCACHE [ WITH NO_INFOMSGS ]
以下示例将刷新分布式查询缓存。
USE AdventureWorks2008R2;
GO
DBCC FREESESSIONCACHE WITH NO_INFOMSGS;
GO
|
8、DBCC CLEANTABLE:回收表或索引视图中已删除的可变长度列的空间。
DBCC CLEANTABLE ( { database_name | database_id | 0 } , { table_name | table_id | view_name | view_id } [ , batch_size ] ) [ WITH NO_INFOMSGS ]
参数
- database_name | database_id | 0
-
要清除的表所在的数据库。如果指定 0,则使用当前数据库。数据库名称必须符合标识符规则。
- table_name | table_id |view_name| view_id
-
要清除的表或索引视图。
- batch_size
-
每个事务处理的行数。如果未指定,或指定为 0,则该语句将在一个事务中处理整个表。
- WITH NO_INFOMSGS
-
取消显示所有信息性消息。
注释
DBCC CLEANTABLE 用于在删除可变长度列之后回收空间。可变长度列可以属于下列数据类型之一:varchar、nvarchar、varchar(max)、nvarchar(max)、varbinary、varbinary(max)、text、ntext、image、sql_variant 和 xml。该命令不回收删除固定长度列后的空间。
如果删除的列存储在行内,则 DBCC CLEANTABLE 将从表的 IN_ROW_DATA 分配单元回收空间。如果列存储在行外,则将根据已删除列的数据类型从 ROW_OVERFLOW_DATA 或 LOB_DATA 分配单元回收空间。如果从 ROW_OVERFLOW_DATA 或 LOB_DATA 页回收空间时产生空页,DBCC CLEANTABLE 将删除该页。有关分配单元和数据类型的详细信息,请参阅表和索引数据结构体系结构。
DBCC CLEANTABLE 作为一个或多个事务运行。如果未指定批大小,则该命令将在一个事务中处理整个表,并在操作过程中以独占方式锁定该表。对于某些大型表,单个事务的长度和所需的日志空间可能太大。如果指定批大小,则该命令将在一系列事务中运行,每个事务包括指定的行数。DBCC CLEANTABLE 不能作为其他事务内的事务运行。
该操作将被完整地记入日志。
系统表或临时表不支持使用 DBCC CLEANTABLE。
最佳做法
不应将 DBCC CLEANTABLE 作为日常维护任务来执行。而应在对表或索引视图中的可变长度列进行重要更改之后并且需要立即回收未使用空间时使用 DBCC CLEANTABLE。或者,也可以重新生成表或视图的索引;但是,此操作会耗费更多资源。
示例
A. 使用 DBCC CLEANTABLE 回收空间
以下示例对 AdventureWorks2008R2 示例数据库中的Production.Document
表执行 DBCC CLEANTABLE。
DBCC CLEANTABLE (AdventureWorks2008R2,"Production.Document", 0)
WITH NO_INFOMSGS;
GO
|
B. 使用 DBCC CLEANTABLE 并验证结果
以下示例创建一个表并用几个可变长度列填充该表。然后删除其中两列,并运行 DBCC CLEANTABLE 以回收未使用空间。在执行 DBCC CLEANTABLE 命令之前和之后,运行查询以验证页计数和已用空间值。
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.CleanTableTest', 'U') IS NOT NULL
DROP TABLE dbo.CleanTableTest;
GO
CREATE TABLE dbo.CleanTableTest
(FileName nvarchar(4000),
DocumentSummary nvarchar(max),
Document varbinary(max)
);
GO
-- Populate the table with data from the Production.Document table.
INSERT INTO dbo.CleanTableTest
SELECT REPLICATE(FileName, 1000),
DocumentSummary,
Document
FROM Production.Document;
GO
-- Verify the current page counts and average space used in the dbo.CleanTableTest table.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;
SET @db_id = DB_ID(N'AdventureWorks2008R2');
SET @object_id = OBJECT_ID(N'AdventureWorks2008R2.dbo.CleanTableTest');
SELECT alloc_unit_type_desc,
page_count,
avg_page_space_used_in_percent,
record_count
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'Detailed');
GO
-- Drop two variable-length columns from the table.
ALTER TABLE dbo.CleanTableTest
DROP COLUMN FileName, Document;
GO
-- Verify the page counts and average space used in the dbo.CleanTableTest table
-- Notice that the values have not changed.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;
SET @db_id = DB_ID(N'AdventureWorks2008R2');
SET @object_id = OBJECT_ID(N'AdventureWorks2008R2.dbo.CleanTableTest');
SELECT alloc_unit_type_desc,
page_count,
avg_page_space_used_in_percent,
record_count
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'Detailed');
GO
-- Run DBCC CLEANTABLE.
DBCC CLEANTABLE (AdventureWorks2008R2,"dbo.CleanTableTest");
GO
-- Verify the values in the dbo.CleanTableTest table after the DBCC CLEANTABLE command.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;
SET @db_id = DB_ID(N'AdventureWorks2008R2');
SET @object_id = OBJECT_ID(N'AdventureWorks2008R2.dbo.CleanTableTest');
SELECT alloc_unit_type_desc,
page_count,
avg_page_space_used_in_percent,
record_count
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'Detailed');
GO
|
9、DBCC DROPCLEANBUFFERS:从缓冲池中删除所有清除缓冲区。
DBCC DROPCLEANBUFFERS [ WITH NO_INFOMSGS ]
此指示符只清掉clean buffer,若希望把dirty buffer的空间也清掉,那么需要先把dirty buffer中的数据写到disk,这可以通过可以执行checkpoint来实现,然后再一起清除掉。
10、DBCC FLUSHPROCINDB:只清除某一个数据库内被高速缓存的程序,以避免用freeproccache清掉所有程序缓存。
declare @i int set @i = DB_ID('wcc') dbcc flushprocindb(@i)
11、DBCC INPUTBUFFER:显示从客户端发送到 Microsoft SQL Server 实例的最后一个语句。
DBCC INPUTBUFFER ( session_id [ , request_id ]) [WITH NO_INFOMSGS ]
参数:
session_id 与各活动主连接关联的会话 ID,注意这个session_id必须是存在的并且是当前连接的会话ID。
- request_id 要在当前会话中精确搜索的请求(批)。下面的查询返回 request_id:
-
SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@spid
- WITH
-
启用要指定的选项。
- NO_INFOMSGS
-
取消严重级别从 0 到 10 的所有信息性消息。
结果集:
DBCC INPUTBUFFER 返回包含如下列的行集。
列名 | 数据类型 | 说明 |
---|---|---|
EventType |
nvarchar(30) |
事件类型。这可能是 RPC 事件或 Language 事件。检测不到上一个事件时,输出为No Event。 |
Parameters |
int |
0 = 文本 1- n = 参数 |
EventInfo |
nvarchar(4000) |
对于 RPC 的 EventType,EventInfo 仅包含过程名。对于 Language 的EventType,仅显示事件的前 4000 个字符。 |
例如,当缓冲区中的最后一个事件是 DBCC INPUTBUFFER(11) 时,DBCC INPUTBUFFER 将返回以下结果集。
EventType Parameters EventInfo -------------- ---------- --------------------- Language Event 0 DBCC INPUTBUFFER (11) (1 row(s) affected) DBCC execution completed. If DBCC printed error messages, contact your system administrator. |
权限
要求执行下列操作之一:
- 用户必须是 sysadmin 固定服务器角色的成员。
- 用户必须具有 VIEW SERVER STATE 权限。
- session_id 必须与正在运行该命令的会话 ID 相同。要确定会话 ID,请执行select @@spid来获取。
示例
以下示例在一个连接上运行一个时间较长的事务,而与此同时在另一个连接上运行 DBCC INPUTBUFFER
。
CREATE TABLE T1 (Col1 int, Col2 char(3)); GO DECLARE @i int; SELECT @i = 0 BEGIN TRAN SELECT @i = 0 WHILE (@i < 100000) BEGIN INSERT INTO T1 VALUES (@i, CAST(@i AS char(3))) SELECT @i = @i + 1 END; COMMIT TRAN; --Start new connection #2. DBCC INPUTBUFFER (52); |
12、 DBCC OUTPUTBUFFER:以十六进制和 ASCII 格式返回指定 session_id 的当前输出缓冲区。
DBCC OUTPUTBUFFER ( session_id [ , request_id ]) [ WITH NO_INFOMSGS ] |
参数
- session_id 与各活动主连接关联的会话 ID。
- request_id 要在当前会话中搜索的精确请求(批)。下面的查询返回 request_id:
-
SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@spid
- WITH
-
允许指定其他选项。
- NO_INFOMSGS
-
取消严重级别从 0 到 10 的所有信息性消息。
结果集
DBCC OUTPUTBUFFER 返回以下结果集(值可能会有变化):
Output Buffer ------------------------------------------------------------------------ 01fb8028: 04 00 01 5f 00 00 00 00 e3 1b 00 01 06 6d 00 61 ..._.........m.a 01fb8038: 00 73 00 74 00 65 00 72 00 06 6d 00 61 00 73 00 .s.t.e.r..m.a.s. '...' 01fb8218: 04 17 00 00 00 00 00 d1 04 18 00 00 00 00 00 d1 ................ 01fb8228: . (33 row(s) affected) DBCC execution completed. If DBCC printed error messages, contact your system administrator. |
注释
DBCC OUTPUTBUFFER 显示发送到指定客户端 (session_id) 的结果。对于不包含输出流的进程,则返回错误消息。
若要显示所执行的、其返回的结果由 DBCC OUTPUTBUFFER 所显示的语句,请执行 DBCC INPUTBUFFER。
示例
以下示例为假定为 52
的会话 ID 返回当前输出缓冲区信息。
DBCC OUTPUTBUFFER (52); |
13、DBCC CURSORSTATUS:显示游标的统计信息。