2017-05-30 171 views
-2

我有在2秒運行(這是確定)一個複雜的查詢,但是如果我運行查詢可怕緩慢後DBCC DROPCLEANBUFFERS/FREEPROCCACHE

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

第一查詢performans進入奧德40秒。我應該擔心嗎?

+2

你似乎是質疑爲什麼沖洗東西展現出來的內存,使您的查詢速度較慢。這將是因爲數據必須從存儲器中讀取.... –

+0

嘗試僅僅DBCC FREEPROCCACHE或重新編譯。如果運行需要40秒,這意味着查詢編譯時間爲38秒。你應該擔心。 –

+2

38秒不一定只是編譯時間。 SQL Server將數據存儲在緩存(RAM)內存中,這有助於查詢執行時間。你不應該擔心,你只是不應該執行這兩個dbcc語句 – PacoDePaco

回答

2

不,Sql服務器正在做確切地說你剛剛告訴它。你要求它清空所有辛苦掙的緩衝區。

它跑第一先前因爲它存儲的有關表中的高速緩存中的信息和查詢和刪除的執行計劃。清除它們後,必須從頭開始重建它們。

不這樣做,除非你有個好理由。

使用DBCC FREEPROCCACHE仔細清除計劃緩存。釋放計劃高速緩存會導致例如重新編譯存儲過程,而不是從高速緩存重用。這可能會導致查詢性能突然暫時下降。對於計劃緩存中每個清除cachestore,SQL Server錯誤日誌將包含以下信息消息:cachestore刷新的「SQL服務器遇到%d次(S)爲‘%s’的cachestore(計劃緩存的一部分)由於'DBCC FREEPROCCACHE'或'DBCC FREESYSTEMCACHE'操作「。只要在該時間間隔內刷新高速緩存,該消息就會每五分鐘記錄一次。

使用DBCC DROPCLEANBUFFERS在不關閉和重新啓動服務器的情況下使用冷緩衝區高速緩存測試查詢。 要從緩衝池中刪除乾淨的緩衝區,首先使用CHECKPOINT生成冷緩衝區高速緩存。這將強制將當前數據庫的所有髒頁寫入磁盤並清理緩衝區。完成此操作後,可以發出DBCC DROPCLEANBUFFERS命令以從緩衝池中刪除所有緩衝區。

+0

在現代系統中,DBCC FREEPROCCACHE不再是一個可怕的命令。 –