このように SQL Server を集中的に使用し、それを微調整する作業については、(仮想) マシンが SQL Server 専用であると想定しています。
そうは言っても、マシンの現在の CPU とメモリの使用率を取得すると、うまくいくはずです。
CREATE PROCEDURE dbo.p_GetSystemUsage
@cpuUsage float out, -- % CPU usage
@memoryUsage float out -- % memory usage
AS
BEGIN
SET NOCOUNT ON;
/*
* % CPU usage
*/
SELECT TOP 1
@cpuUsage = 100 - r.SystemIdle
FROM (
SELECT
rx.record.value('(./Record/@id)[1]', 'int') AS record_id,
rx.record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle
FROM (
SELECT 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 rx
) AS r
ORDER BY r.record_id DESC
/*
* % memory usage
*/
SELECT
@memoryUsage =
(((m.total_physical_memory_kb - m.available_physical_memory_kb) /
convert(float, m.total_physical_memory_kb)) *
100)
FROM sys.dm_os_sys_memory m
END
いくつかの注意事項:
sys.dm_os_sys_memory
マシンの物理メモリ使用量の良い情報源です。マシンのページ ファイルの使用状況に関する同様の情報を提供します。私の経験では、その情報は頻繁に変更されます。1 秒以内に複数のクエリを実行すると、異なる結果が得られます。
sys.dm_os_ring_buffers
は、マシンの CPU 使用率の良い情報源ですが、私が見たものから毎分更新されるほど頻繁ではありません。より多くのリアルタイム情報が必要な場合は、これに影響を与えることができます。
- の CPU 使用率の値
sys.dm_os_ring_buffers
は整数ですが、仕様ごとに作成@cpuUsage
しました。float
ストアド プロシージャは 2 つのfloat
パラメーターを使用するため、CPU 使用率の決定をリファクタリングして、呼び出し元を変更せずに小数部分を提供できます。