Sql-Server

從 T-SQL 過程訪問性能計數器

  • October 13, 2016

我想寫一個儲存過程,它返回CPU utilisation,Memory utilisationCount of rows in table T1. 所以它應該看起來像:

SELECT cpu, memory, (SELECT COUNT(*) FROM T1) as T1RowCount
FROM perfmon

但問題是我無法從腳本中訪問cpu和訪問memory:我查看了sys.dm_os_ring_bufferssys.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)

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