狀態查詢:收集和顯示各類信息,狀態檢查。
如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)
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:顯示游標的統計信息。