2011年9月26日 星期一

SQL Server 記憶體管理 - DBCC FREEPROCCACHE 說明與應用

底下的這篇是由國外的 SQL Server Central 的網站中載址而來,主要介紹 DBCC FREEPROCCCACHE的使用與介紹,再請大家參閱:

原文主旨:Fun With DBCC FREEPROCCACHE

最近任何時候你可以看到關於 DBCC FREEPROCCACHE 指令的訊息公告在部落格、雜誌文章或書本上,你會得到一些嚇人的警告建議您不要使用他在正式產品的系統上。除非您真的有心理準備此系統會有很大的影響。在範例上,官方線上說明也有講到使用 DBCC FREEPROCCACHE 去清除快取計畫要非常的小心。通常釋放快取計畫的原因,在範列上,一個預儲程序去重新編譯取代快取的重覆使用,SQL Server 錯誤記錄將包含下列的資訊: "SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations." 這個訊息是記錄當快取刷新在區間每五分鐘內。

我將討論關於執行 DBCC FREEPROCCACHE 並不會造成更多的窘境,當在一個非常忙錄的OLTP系統上。大部份的系統在計畫重新編譯的過程中將造成大量的CPU使用率變高。實際上,他主要是用的在於重設 cached_time 時間對於 sys.dm_exec_procedure_stats, 如同大部份的預儲程序在你的一般工作負載上。這可以透過簡單的方式去取得查詢成本較重的查詢或預儲程序在一個累計的基礎上,你可以看到在總計的工作時間或總計的邏輯讀取的增進。

說了這麼多,我將要顯示一個簡單的方法去清除全部或部份的快取,雖然可能會稍微影響到系統。執行 DBCC FREEPROCCACHE 是一種暴力方法。所以如果你是考量到這部份,你可以執行下列所示的變化之一。

Example 1 (Sledgehammer)

-- Remove all elements from the plan cache for the entire instance
DBCC FREEPROCCACHE;

-- Flush the cache and suppress the regular completion message
-- "DBCC execution completed. If DBCC printed error messages, contact your system administrator."
DBCC FREEPROCCACHE WITH NO_INFOMSGS;

-- Example 2 (Ballpeen hammer)
-- Remove all elements from the plan cache for one database
-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid]
FROM master.dbo.sysdatabases
WHERE name = 'AdventureWorks');

-- Flush the procedure cache for one database only
DBCC FLUSHPROCINDB (@intDBID);

-- Example 3 (Scalpel)
-- Remove one plan from the cache
-- Get the plan handle for a cached plan
SELECT cp.plan_handle, st.[text]
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE [text] LIKE N'%/* GetOnlineSearchResultsMonday %';

-- Remove the specific plan from the cache using the plan handle
DBCC FREEPROCCACHE (0x05000800F7BA926C40C15055070000000000000000000000);


個人說明備註:
其實寫到這我個人有一個疑問,也就是在什麼時候才會去執行這個指令,後來經過我的查詢後找到使用的時機,假設當你透過 sp_configure 來改變設定值,如 max degree of parallelism ,由於改變這個值之後會影響到計畫的執行,但是由於查詢已經被快取了,所以造成計畫不會重新編譯,這時如果您不能重新啟動服務時,你就可以透過這個指令來清除快取。

參考資訊:
  1. Fun With DBCC FREEPROCCACHE:http://www.sqlservercentral.com/blogs/glennberry/archive/2009/12/28/fun-with-dbcc-freeproccache.aspx
  2. DBCC FREESYSTEMCACHE (Transact-SQL):http://msdn.microsoft.com/zh-tw/library/ms178529.aspx
  3. DBCC FREEPROCCACHE (Transact-SQL):http://msdn.microsoft.com/zh-tw/library/ms174283.aspx

關鍵字:SQL ServerMemoryDBCC FREEPROCCACHE

沒有留言:

張貼留言