資源調控器是sql server 2008新增中的功能,可以限制某些使用者通路sql server所消耗的cpu、記憶體資源或是對某個庫通路所所消耗的cpu、記憶體資源,可以在SQL Server 的 Enterprise Edition、Developer Edition 和 Evaluation Edition中使用。
配置資源調控器基本分為以下步驟:
1. 建立并配置一個資源調控器資源池,發生 CPU 争用時,該資源池将限制配置設定給資源池中的請求的最大平均 CPU 帶寬。
2. 建立并配置一個使用該池的資源調控器工作負荷組。
3. 建立一個“分類器函數”,它是一個使用者定義函數 (UDF),其傳回值供資源調控器用來對會話進行分類,以便将它們路由到适當的工作負荷組。
4. 将分類器函數注冊到資源調控器。
5. 将更改應用于資源調控器記憶體中配置。
本測試示例是限制某查詢使用者USER_READONLY限制cpu最大為10%.
示例代碼(代碼參考msdn聯機文檔):
-- 配置資源調控器.
BEGIN TRAN
USE master;
-- 建立并配置一個資源調控器資源池,發生 CPU 争用時,
-- 該資源池将限制配置設定給資源池中的請求的最大平均 CPU 帶寬 10%
CREATE RESOURCE POOL pMAX_CPU_PERCENT_10
WITH
(MAX_CPU_PERCENT = 10);
GO
-- 建立并配置一個使用該池的資源調控器工作負荷組。
CREATE WORKLOAD GROUP gMAX_CPU_PERCENT_10
USING pMAX_CPU_PERCENT_10;
-- 建立一個“分類器函數”,它是一個使用者定義函數 (UDF),
-- 其傳回值供資源調控器用來對會話進行分類,以便将它們路由到适當的工作負荷組
-- 本例是限制使用者為:USER_READONLY所使用的cpu資源不超過10%
CREATE FUNCTION dbo.rgclassifier_MAX_CPU() RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN
DECLARE @workload_group_name AS sysname
IF (SUSER_NAME() = 'USER_READONLY')
SET @workload_group_name = 'gMAX_CPU_PERCENT_10'
RETURN @workload_group_name
END;

-- 将分類器函數rgclassifier_MAX_CPU注冊到資源調控器
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= dbo.rgclassifier_MAX_CPU);
COMMIT TRAN;
-- 将更改應用于資源調控器記憶體中配置ALTER RESOURCE GOVERNOR RECONFIGURE;
--包含資源調控器的目前記憶體中配置狀态的行
select * from sys.dm_resource_governor_configuration
--目前資源池狀态、資源池的目前配置以及資源池統計資訊的相關資訊
select * from sys.dm_resource_governor_resource_pools
--工作負荷組統計資訊和工作負荷組目前在記憶體中的配置
select * from sys.dm_resource_governor_workload_groups
這樣,資源資源調控器配置完成,下面進行一下測試
建立一個public帳号:
USE master
CREATE LOGIN USER_READONLY WITH PASSWORD ='Nzperfect'
我們用這個USER_READONLY帳号登陸sql server,
然後測試一下,執行下面的T-sql循環腳本
DECLARE @CNT INT
WHILE 1=1
SELECT @CNT=COUNT(*) FROM sys.tables
END

打開性能螢幕,并添加資源調器資源池cpu使用計數器,如下多圖:
在以USER_READONLY登陸執行T-sql腳本後,pMAX_CPU_PERCENT_10資源池占用cpu為50%如下圖:
然後,我們以sa帳号登陸sql server ,同時也執行上面的T-sql循環腳本,再看性能螢幕計數,如圖:
由上圖可以看到,gMAX_CPU_PERCENT_10所占用的cpu立即下降到5%左右,說明我們配置的配置資源調控器已生效。
這時,如果取消sa執行的T-sql循環,則結果如下:
由上面的測試說明,當系統資源夠用時,USER_READONLY像正常情況一下,sql server不會限制其使用的cpu資源,但當存在資源競争時,資源調控器将跟據配置的資源池及組資訊自動調節,限制USER_READONLY使用的資源,以確定其它程序擁用更多的資源。
--測試結束,删除測試
DROP WORKLOAD GROUP gMAX_CPU_PERCENT_10
ALTER RESOURCE GOVERNOR RECONFIGURE;
DROP RESOURCE POOL pMAX_CPU_PERCENT_10
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= null);
DROP FUNCTION [dbo].[rgclassifier_MAX_CPU]