在多租戶或混合負載環境中,防止特定登入帳號佔用過多 CPU 資源,影響其他關鍵業務。SQL Server Resource Governor(資源管理器)提供精細的資源配額控制能力。
-- 限制 CPU 上限 25%
CREATE RESOURCE POOL pMAX_CPU_PERCENT_25
WITH (MAX_CPU_PERCENT = 25);
GO
CREATE WORKLOAD GROUP gMAX_CPU_PERCENT_25
USING pMAX_CPU_PERCENT_25;
GO
-- 限制 CPU 上限 35%
CREATE RESOURCE POOL pMAX_CPU_PERCENT_35
WITH (MAX_CPU_PERCENT = 35);
GO
CREATE WORKLOAD GROUP gMAX_CPU_PERCENT_35
USING pMAX_CPU_PERCENT_35;
GO
根據登入帳號導向對應工作負載群組:
CREATE FUNCTION dbo.rgclassifier_MAX_CPU() RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
DECLARE @grp_name AS sysname;
IF (SUSER_NAME() = 'u01')
SET @grp_name = 'gMAX_CPU_PERCENT_25';
ELSE IF (SUSER_NAME() = 'u02')
SET @grp_name = 'gMAX_CPU_PERCENT_35';
ELSE
SET @grp_name = 'default';
RETURN @grp_name;
END;
GO
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rgclassifier_MAX_CPU);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
ALTER RESOURCE GOVERNOR RESET STATISTICS;
GO
以下查詢可即時監控會話所屬工作負載群組與資源消耗:
SELECT
s.session_id AS [Session ID],
s.login_name AS [Login],
DB_NAME(p.dbid) AS [Database],
s.program_name AS [Application],
s.cpu_time AS [Total CPU (ms)],
s.host_name AS [Host Name],
c.client_net_address AS [Net Address],
g.name AS [Workload Group]
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_connections c ON s.session_id = c.session_id
LEFT JOIN sys.sysprocesses p ON s.session_id = p.spid
LEFT JOIN sys.dm_resource_governor_workload_groups g ON g.group_id = s.group_id
WHERE s.login_name IN ('u01','u02')
ORDER BY s.session_id;