SQL Server 數據庫性能緩慢
我在生產中有一個 SQL Server 數據庫,通常連接數據庫的應用程序的性能令人滿意。幾天來,許多客戶抱怨系統性能緩慢。在幾秒鐘內載入的報告現在在幾分鐘內載入。我已經很長時間沒有更新統計數據了,所以我嘗試過
index defragmentation
提高updating statistics
性能,但都沒有幫助。突然想到這個問題可能是由於記憶體的執行計劃昂貴,執行了以下兩個
DBCC
命令:DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS
通過執行上述命令,我能夠將性能提高到正常狀態。
我的猜測是正確的還是有其他我不知道的?
下一次,此查詢將按查詢時間收集前 25 個記憶體儲存過程(我想我是從 Paul White 那裡得到的,但這可能不准確):
-- Top Cached SPs By Avg Elapsed Time SELECT TOP(25) p.name AS [SP Name], qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], qs.total_elapsed_time, qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.total_worker_time AS [TotalWorkerTime], qs.cached_time FROM sys.procedures AS p WITH (NOLOCK) INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK) ON p.[object_id] = qs.[object_id] WHERE qs.database_id = DB_ID() ORDER BY avg_elapsed_time DESC OPTION (RECOMPILE);
這將幫助您確定哪些程序執行緩慢。(還要記下 Worker Time 列,並在需要時將 ORDER BY 更改為它們)。找到問題儲存過程後,在下次執行時將其設置為 RECOMPILE:
EXEC sp_recompile N'Your_Stored_Procedure_Name';
關於 sp_recompile 的更多資訊可以在這裡找到: https ://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-recompile-transact-sql
像使用以下內容一樣清除計劃記憶體:
DBCC FREEPROCCACHE
清除了報告的執行計劃,與 sp_recompile 一樣,但 freeproccache 也會帶走其他所有內容。從 Microsoft 站點: https ://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freeproccache-transact-sql
FREEPROCCACHE - “隨著新編譯數量的增加,這可能會導致查詢性能突然暫時下降。”
您還應該更新您的統計數據。最簡單的更新方法是:
EXEC sp_updatestats;
但這更像是一把錘子(如 FREEPROCCAHE),因為它會更新所有內容,而不是針對使用的表。