Sql-Server-2008-R2
Glenn Berry 查詢中的疑問(每個數據庫的 CPU)
請,如果這裡不是發布此類問題的地方,請告訴我,我將刪除它。
在 Glenn berry 的診斷查詢中,有一個查詢顯示數據庫正在使用多少 CPU。這是查詢:
-- Get CPU utilization by database (Query 24) (CPU Usage by Database) WITH DB_CPU_Stats AS (SELECT DatabaseID, DB_Name(DatabaseID) AS [Database Name], SUM(total_worker_time) AS [CPU_Time_Ms] FROM sys.dm_exec_query_stats AS qs CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] FROM sys.dm_exec_plan_attributes(qs.plan_handle) WHERE attribute = N'dbid' ) AS F_DB GROUP BY DatabaseID) SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [CPU Rank], [Database Name], [CPU_Time_Ms] AS [CPU Time (ms)], CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU Percent] FROM DB_CPU_Stats WHERE DatabaseID <> 32767 -- ResourceDB ORDER BY [CPU Rank] OPTION (RECOMPILE);
我想知道,如果這是查看
now
使用更多 CPU 的數據庫的查詢,還是基於過去的資訊?我想知道是什麼導致我的伺服器 CPU 使用率高:
好吧,在這張圖片中,伺服器非常好,但幾乎總是我們有 90% 以上的 CPU 使用率,並且使用
sp_whoisactive
我什麼也找不到(顯然我有很多查詢,但似乎沒有一個是在錘擊伺服器)。而且讀\寫非常低(每次)。這就是我要理解的問題。低讀/寫伺服器如何使用這麼多 CPU?I/O 與 CPU 沒有共同點嗎?我想知道哪個數據庫是最重的,以便遷移它。
乍一看,這在我看來是每個數據庫的近似 CPU,在歷史上
sys.dm_exec_query_stats
(通常是自上次重新啟動以來),但僅適用於目前在記憶體中的計劃。它還依賴於計劃記憶體屬性 ,dbid
這意味著這是查詢的上下文,但不一定是導致工作的數據庫。例如,猜測該查詢的所有 CPU 報告的位置:USE tempdb; GO SELECT CONVERT(DATETIME, CONVERT(CHAR(10), CONVERT(DATE, CONVERT(DATETIME, o.create_date)), 120)) FROM msdb.sys.all_objects AS o CROSS APPLY model.sys.all_columns AS c;
我給你一個提示:不是
msdb
ormodel
。因此,它應該被用作一個球場,但不能保證它在 100% 的時間裡 100% 地反映現實。您查詢它的頻率越高(例如,有一些自動作業,每 n 分鐘儲存一次它的快照),它就會越準確,但除非您的應用程序將每個數據庫視為不可穿透的孤島,否則它仍然會受到數據庫上下文的影響而不是查詢和數據的實際來源。