8

我有一些查詢在我們的實時環境中導致超時。 (> 30秒)如何解決只在緩存前運行緩慢的查詢

如果我運行profiler並抓取正在運行的SQL並從Management Studio運行,那麼他們需要很長時間才能運行第一次,然後在每次運行後降至幾百毫秒。

這顯然是SQL緩存數據並將其全部存入內存。

我確信可以對SQL進行優化,使其運行速度更快。

我的問題是,我怎麼能「修復」這些查詢時,我第二次運行它的數據已被緩存,並且速度很快?

回答

8

http://morten.lyhr.dk/2007/10/how-to-clear-sql-server-query-cache.html,您可以運行以下清除緩存:

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

編輯:我與SQL Server文檔我有檢查,這至少是真實的SQL Server 2000

+0

優秀!正是我在找什麼。運行查詢時,我現在得到完全一致的結果! – 2009-01-29 12:48:18

+1

這不就是讓它每次都運行緩慢嗎? – DevinB 2009-01-29 14:31:07

+1

您不必每次都緩慢地運行查詢以優化查詢。無論結果是否被緩存,查詢計劃都會保持一致(請參閱我的回答) – 2009-01-31 09:09:48

2

查詢優化是一個很大的主題,對於你的問題沒有單一的答案。無論結果是否被緩存,關於做什麼的線索都在查詢計劃中應該是相同的。

查找常用的東西,如表掃描,當你希望他們使用不使用索引,等等,等等最終你可能不得不revew數據模型,也許實施denormalisation戰略。

0

來自MSDN:
「使用DBCC DROPCLEANBUFFERS在不關閉並重新啓動服務器的情況下使用冷緩衝區高速緩存測試查詢。」

4

使用可以使用

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

但只能用這個在你的開發環境,同時調整部署查詢到實時的服務器。

8

我可以建議您檢查執行計劃的負責你的糟糕的性能問題的查詢。

您需要在執行計劃中確定哪些步驟具有最高的成本和原因。例如,可能是您的查詢正在執行表掃描,或者正在使用不適當的索引。

RedGate網站提供了一個非常詳細的免費電子書,專門用於瞭解執行計劃的內容。

https://www.red-gate.com/Dynamic/Downloads/DownloadForm.aspx?download=ebook1

您可能會發現,還有就是你想用於查詢特定的執行計劃。您可以使用查詢提示強制SQL Server中的查詢使用哪個執行計劃。這是一個非常先進的概念,應該謹慎使用。有關更多詳細信息,請參閱以下Microsoft白皮書。

http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx

我也不會建議你清除生產環境過程緩存,因爲這將不利於所有其他查詢平臺上目前尚未遇到性能問題的表現。

例如,如果您正在執行存儲過程,則可以通過使用WITH RECOMPILE命令確保爲每次執行過程計算新的執行計劃。

對於整體性能調優信息,Brent Ozar博客上有一些優秀的資源。

http://www.brentozar.com/sql-server-performance-tuning/

希望這會有所幫助。乾杯。

3

我認爲人們往往走錯了方向。如果我明白了,你希望表演始終保持良好狀態?他們在第二次(以及後續的執行)中跑得不快,而且第一次很慢?

上面的DBCC命令清除緩存,導致WORSE性能。

你想要什麼,我認爲,首要的是泵和緩存數據。您可以使用一些執行查詢並將數據加載到內存的啓動過程來執行此操作。內存是一種有限的資源,因此您無法將所有數據加載到內存中,但可以找到平衡點。布倫特上​​面有一些很好的參考資料可以幫助你瞭解你在這裏可以做什麼。