從 T-SQL 過程訪問性能計數器
我想寫一個儲存過程,它返回
CPU utilisation
,Memory utilisation
和Count of rows in table T1
. 所以它應該看起來像:SELECT cpu, memory, (SELECT COUNT(*) FROM T1) as T1RowCount FROM perfmon
但問題是我無法從腳本中訪問
cpu
和訪問memory
:我查看了sys.dm_os_ring_buffers
和sys.dm_os_performance_counters
其他人,但它們沒有提供實際資訊(例如,Resource Pool Stats
組中的每個計數器始終返回 0)。另一種解決方法是配置
PerfMon
直接在 SQL 表中寫入,然後在此儲存過程中獲取它們,但它有兩個缺點:它很複雜,並且當我真的想使用 vanilla T-SQL 收集所需資訊時,它需要外部工具配置。我有一個程序正在報告其執行狀況(CPU 使用率、T 類型的已分配對像數等)。但我目前不提供有關可能安裝在另一台機器上的 SQL Server 的此類資訊,所以我想提供。但由於未知原因,對
Resource Pool Stats
像只是不提供任何資訊:計數器只是空的。Rowcount 告訴我有多少元素沒有被處理。行由生產者添加並由消費者刪除。因此,如果此數字為 0,則生產者不工作。如果這個數字在增長,那麼消費者就發生了一些事情……在某些情況下,此資訊可能有用。
我目前從櫃檯得到的是……什麼都沒有:
這應該可以通過 SQLCLR 實現。PerformanceCounter類位於System.dll中,它是受支持的 .NET Framework 庫之一。包含自定義 .NET 程式碼的程序集至少需要設置為
EXTERNAL_ACCESS
.我稍後會自己嘗試,並用結果更新這個答案。
這將為您提供過去 4 小時的 CPU 歷史記錄。它來自 Microsoft DMV,可以很方便地回到過去查看歷史。
--CPU for the last 4.x hours declare @ts_now bigint select @ts_now = ms_ticks from sys.dm_os_sys_info select record_id , dateadd (ms, (y.[timestamp] -@ts_now), GETDATE()) as EventTime , SystemIdle Idle , SQLProcessUtilization [SQL] , 100 - SystemIdle - SQLProcessUtilization as OtherProcessUtilization , 0 + SQLProcessUtilization +(100 - SystemIdle - SQLProcessUtilization) as Total_CPU_usage from ( select record.value('(./Record/@id)[1]', 'int') as record_id ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') as SystemIdle ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]' ,'int') as SQLProcessUtilization ,timestamp from ( select timestamp, convert(xml, record) as record from sys.dm_os_ring_buffers where ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' and record like '%<SystemHealth>%' ) as x ) as y order by record_id desc;
這會給你記憶:
SELECT 'Memory Grants' as What, mg.granted_memory_kb, mg.session_id, t.text, qp.query_plan FROM sys.dm_exec_query_memory_grants AS mg CROSS APPLY sys.dm_exec_sql_text(mg.sql_handle) AS t CROSS APPLY sys.dm_exec_query_plan(mg.plan_handle) AS qp ORDER BY mg.granted_memory_kb DESC OPTION (MAXDOP 1)