Sql-Server

SQL Server 數據庫性能緩慢

  • July 3, 2019

我在生產中有一個 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),因為它會更新所有內容,而不是針對使用的表。

引用自:https://dba.stackexchange.com/questions/241978