DBCC 命令2

狀態查詢:收集和顯示各種信息,狀態檢查。sql

如cachestats、psssqlmgrstats、memorystatus、proccachefreeproccache、freesystemcache、freesessioncache、dropcleanbuffers、flushprocindb、inputbuffer、outputbuffer、cursorstats等。數據庫

一、DBCC CACHESTATS:顯示SQL Server2000中高速緩存中各類對象的數量與高速緩存的命中率,命中率越高越好,在SQL Server 2008中再也不支持。緩存

      DBCC PSS :顯示當前鏈接到SQL Server 2000服務器的進程信息,在SQL Server 2008中再也不支持。服務器

 

二、 DBCC SQLMGRSTATS:用於產生3個不一樣的值,這些值用在你想查看高速緩存在ad-hoc和預編譯的TSQL語句中是如何工做的。session

 

返回值說明: Memory Used(8K Pages):若內存頁的數量很是大,這也許代表一些用戶鏈接正在預處理許多T-SQL語句。 數據結構

Number CSql Objects:代表已經在高速緩存中的T-SQL的語句的總數 異步

Number False Hits:有時,當sql server匹配在高速緩存中已經存在的T-SQL語句時會出現錯誤的命中。在理想的狀況下,這個數字應該儘量地小。分佈式

 

三、DBCC MEMORYSTATUS:列出各項SQL Server內存緩存區的使用狀況。性能

返回了大量的有關內存方面的信息,在動態性能視圖sys.dm_os_memory_clerks中有相似的信息。spa

 

四、DBCC PROCCACHE:顯示過程的執行計劃高速緩存的使用狀況。

返回值中前3個是顯示了個數,後3個是:

列名 描述
num proc buffs 過程高速緩存中可能有的存儲過程數。
num proc buffs used 容納存儲過程的高速緩存槽數。
num proc buffs active 容納正在執行的存儲過程的高速緩存槽數。
proc cache size 過程高速緩存的總大小。
proc cache used 容納存儲過程的過程高速緩存量。
proc cache active 容納正在執行的存儲過程的過程高速緩存量。

 

 

五、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_planssys.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

 

六、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;

 

七、DBCC FREESESSIONCACHE:

刷新針對 Microsoft SQL Server 實例執行的分佈式查詢所使用的分佈式查詢鏈接緩存。

DBCC FREESESSIONCACHE [ WITH NO_INFOMSGS ]

如下示例將刷新分佈式查詢緩存。

   
USE AdventureWorks2008R2;
GO
DBCC FREESESSIONCACHE WITH NO_INFOMSGS;
GO

 

八、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 用於在刪除可變長度列以後回收空間。可變長度列能夠屬於下列數據類型之一:varcharnvarcharvarchar(max)nvarchar(max)varbinaryvarbinary(max)textntextimagesql_variantxml。該命令不回收刪除固定長度列後的空間。

若是刪除的列存儲在行內,則 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

 

九、DBCC DROPCLEANBUFFERS:從緩衝池中刪除全部清除緩衝區。

DBCC DROPCLEANBUFFERS [ WITH NO_INFOMSGS ]

此指示符只清掉clean buffer,若但願把dirty buffer的空間也清掉,那麼須要先把dirty buffer中的數據寫到disk,這能夠經過能夠執行checkpoint來實現,而後再一塊兒清除掉。

 

十、DBCC FLUSHPROCINDB:只清除某一個數據庫內被高速緩存的程序,以免用freeproccache清掉全部程序緩存。

  1. declare @i int 
  2.  
  3. set @i = DB_ID('wcc'
  4.  
  5. dbcc flushprocindb(@i) 
declare @i int

set @i = DB_ID('wcc')

dbcc flushprocindb(@i)

十一、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 的 EventTypeEventInfo 僅包含過程名。對於 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);
 

十二、  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);

 

1三、DBCC CURSORSTATUS:顯示遊標的統計信息。

相關文章
相關標籤/搜索