數據庫系統的資源是指內存和CPU(處理器)資源,擁有資源的多寡,決定了數據查詢的性能。當一個SQL Server實例上,擁有多個獨立的工做負載(workload)時,使用資源管理器(Resource Governor),可以實現系統資源在邏輯上的隔離,解決在一臺SQL Server實例上,管理多用戶工做負載的需求。資源管理器容許數據庫管理員(DBA)經過編程設置資源池,配置資源池擁有資源的上限,資源池是每個請求可以使用的資源,這樣設置以後,強制系統在處理用戶發送的請求(Requsts)時所耗費的CPU 和 Memory資源的數量不能超過限制,在必定程度上,限制用戶可以使用的資源數量,隔離了失控(runaway)的查詢對系統的影響。對於SQL Server 2012來講,用戶可以基於工做負載,實現CPU資源的徹底隔離,並能設置CPU資源使用量的硬上限(CAP Usage,Hard Limit)。在一個多用戶、高併發的SQL Server實例上,管理員使用Resource Governor,控制不一樣工做負載對內存和CPU資源的使用量,使不一樣的應用程序在資源的使用上相互隔離,使系統性能獲得可預測性的控制和保證。html
一,資源管理器的基本構成sql
Resource Governor的可編程部分由三部分組成:Resource Pool,Workload Group 和 Classifier Function,每一個部分實現不一樣的功能。數據庫
1,資源池(Resource Pool)編程
在SQL Server實例中,資源隔離的基本單位是Resource Pool,正如其名,該對象是資源池,在建立Resource Pool時,指定該Pool擁有的CPU和Memory資源的數量範圍。在SQL Server 2012版本中,最多能夠建立62個用戶自定義的Resource Pool。SQL Server內置了兩個Resource Pools:internal用於系統Task,用戶不能配置;default是默認的Resource Pool,用於任何沒有指定Resource Pool的Request;
2,負載分組(Workload Group)windows
Workload Group是邏輯上的實體,用於表示一個或多個工做負載。實際上,一個工做負載是SQL Server實例接收到的一個查詢請求(Request),經過Classifier Function將多個具備共同屬性的Requests劃分到相同的Workload Group中。每個Resource Pool服務於一個或多個工做負載分組,這就是說,這些工做負載分組可以共享同一個Resource Pool中擁有的資源。服務器
SQL Server內置兩個負載分組:internal和default,關聯到相應的internal和default資源池,internal負載分組用於系統Task,SQL Server將沒有被分類函數顯式指定負載分組的Request劃分到default 分組中。session
3,分類函數(Classifier Function)併發
分類函數根據指定的規則(Rule),例如,根據Login,應用程序名稱,數據庫名字等屬性,將接收的Request分配(路由)到不一樣的負載分組中,能夠指定用戶定義的負載分組或default負載分組。app
4,處理流程ide
Resource Governor各個部分相互配合,控制內存和CPU資源的使用:Classification將SQL Server實例接收到的Requests進行分類,劃分到不一樣的負載組中,負載組與之關聯的Resource Pool中包含的CPU和內存資源來處理Request,Resource Governor的處理流程以下圖:
Resource Pool 是SQL Server實例中物理資源的子集,因爲位於同一個實例上的全部數據庫共享該實例的全部資源,所以,最好將Resource Pool的三個組成對象建立在master 數據庫中。
二,建立和使用資源管理器
資源管理器默認是關閉的,在使用以前,必須啓用。用戶能夠經過SSMS啓用資源管理器,展開Management,選擇Resource Governor,右擊彈出快捷菜單,點擊「Enable」,啓用資源管理器:
或者,使用TSQL命令, 從新配置,啓用資源管理器:
ALTER RESOURCE GOVERNOR RECONFIGURE; GO
1, 建立自定義的資源池(Resource Pool)
SQL Server 內置兩個資源池:internal和default,internal是系統內部使用的,default是默認的資源池,當一個查詢請求沒有指定資源池時,使用默認的資源池。爲了管理用戶不一樣的工做負載,DBA須要根據業務需求建立自定義的資源池。在建立資源池時,須要注意,資源池的選項都是比例關係,全部資源的下限(MIN_MEMORY_PERCENT或MIN_CPU_PERCENT)的加和不能超過系統的物理資源總量,即不能超過100。
CREATE RESOURCE POOL rp_20Percent WITH ( MIN_CPU_PERCENT = 0, MAX_CPU_PERCENT = 40, CAP_CPU_PERCENT = 40, AFFINITY SCHEDULER = auto, MIN_MEMORY_PERCENT = 0, MAX_MEMORY_PERCENT = 20 );
CAP_CPU_PERCENT選項:設置資源池擁有CPU資源的硬上限,任何Workload Group使用的CPU數量不可能超過該上限,而資源池使用的CPU資源有可能超過 MAX_CPU_PERCENT 選項指定的比例。
2,建立工做負載組(Workload Group)
建立工做負載分組,經過using子句關聯該分組可以使用的資源池,一個工做負載分組只能關聯一個資源池,一個資源池能夠服務一個或多個工做負載分組。
CREATE WORKLOAD GROUP wg_20Percent WITH ( IMPORTANCE = MEDIUM, REQUEST_MAX_MEMORY_GRANT_PERCENT=20, REQUEST_MAX_CPU_TIME_SEC=0, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP=0, GROUP_MAX_REQUESTS=0 ) USING rp_20Percent;
IMPORTANCE選項:有三個可選值:Low,Medium和High,默認值是Medium,該選項用於指定該Workload Group在關聯的資源池(Resource Pool)中相對的重要性,因爲同一個能夠Resource Pool關聯多個Workload Group,當一個工做負載組(Workload Group)的Importance數值高於其餘工做負載組(Workload Group)時,在競爭Resource Pool中的資源時,更容易獲勝。當前工做負載組的IMPORTANCE的選項不會使用其餘資源池,也不會影響其餘資源組中的工做負載。
REQUEST_MAX_MEMORY_GRANT_PERCENT:默認值是25,用於指定工做負載組可以從資源組中申請到的最大授予內存(Grant Memory)資源,因爲授予內存跟執行的SORT和HASH JOIN操做有關,若是設置REQUEST_MAX_MEMORY_GRANT_PERCENT爲0,這意味着,SQL Server引擎將不容許執行排序和哈希連接操做。
MAX_DOP:用於指定併發查詢的最大併發度(Degree of Parallelism),默認值是0,表示使用全局配置(Global Setting)。
3,建立分類函數(Classifier Function)
分類函數根據特定的規則(Rule)把接收的request路由到不一樣的資源池中,用戶應該把分類函數建立在master數據庫中,這樣,函數的做用域就是整個SQL Server實例,分類函數的執行上下文是master 數據庫;若是分類函數返回NULL,default或不存在的工做負載組的名稱,那麼查詢被路由導default資源池:
If the user-defined function returns NULL, default, or the name of non-existent group the session is given the default workload group context. The session is also given the default context if the function fails for any reason.
The function should be defined with server scope (master database).
例如,根據用戶名稱,將Request劃分到wg_20Percent負載分組。默認狀況下,任何沒有指定Workload Group的Request,都分發到Default資源池。在實際產品環境中,也可使用APP_NAME()獲取應用程序名字,或者SUSER_NAME()獲取用戶的登錄(Login)名稱,根據應用程序或登錄名稱劃分負載分組。
CREATE FUNCTION dbo.rgClassifierFunction_20Percent() RETURNS sysname WITH SCHEMABINDING AS BEGIN DECLARE @Workload_Group_Name AS sysname IF (SUSER_NAME() = 'USER_READONLY') SET @workload_group_name = 'wg_20Percent' RETURN @workload_group_name END;
經常使用於分類函數(Classifier Function)中的函數以下,這些函數的執行上下文是整個Server:
注意:列表中函數執行的上下文和分類函數的上下文相同,若是分類函數被建立在master數據庫,那麼分類函數的查詢的範圍是在master數據庫。
執行上下文是單個數據庫的函數是:
函數:IS_MEMBER('role | group'),用於檢測當前的用戶(User)是否屬於當前數據庫的role或windows group。一般狀況下,咱們把分類函數建立在master系統數據庫中,這會致使函數的執行上下文是master數據庫,而不是用戶數據庫,而master數據庫中可能不存在windows group(數據庫用戶User),這會致使函數沒法起到分類的做用:
IS_MEMBER doesn’t work here as it’ll be firing in the context of the master db, not the user database you’re interested in.
爲了解決這個問題,必須在master數據庫中建立相應的windows group(數據庫用戶User)。
4,啓動資源管理器(Resource Governor)
爲了啓動資源管理器(Resource Governor),首先配置資源管理器使用的分類函數,把資源管理器和分類函數關聯起來;而後,從新配置資源管理器,啓動Resource Governor。啓動以後,SQL Server引擎使用分類函數對把SQL Server實例接收的查詢請求(Requests),分配到不一樣的負載分組中。
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.rgClassifierFunction_20Percent); GO ALTER RESOURCE GOVERNOR
RECONFIGURE; GO
5,修改分類函數
修改分類函數,須要先禁用資源管理器,而後解除分類函數和資源管理器的關聯關係,而後修改分類函數,把資源管理器和分類函數從新綁定:
ALTER RESOURCE GOVERNOR DISABLE; GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=NULL); GO ALTER FUNCTION dbo.rgClassifierFunction_20Percent() RETURNS sysname WITH SCHEMABINDING AS BEGIN .... END; GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.rgClassifierFunction_20Percent); GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO
三,查看資源管理器
經過如下三個視圖查看資源管理器的元數據:
sys.resource_governor_configuration
sys.resource_governor_workload_groups
sys.resource_governor_resource_pools
經過如下三個DMV查看資源管理器的統計數據:
sys.dm_resource_governor_configuration
sys.dm_resource_governor_workload_groups
sys.dm_resource_governor_resource_pools
DMV sys.dm_exec_requests 和 sys.dm_exec_sessions 中包含group_id字段,用於表示當前session或request處於的工做負載分組。
MSDN示例腳本:
CREATE FUNCTION dbo.rgclassifier_v1() RETURNS sysname WITH SCHEMABINDING AS BEGIN -- Declare the variable to hold the value returned in sysname. DECLARE @grp_name AS sysname -- If the user login is 'sa', map the connection to the groupAdmin workload group. IF (SUSER_NAME() = 'sa') SET @grp_name = 'groupAdmin' -- Use application information to map the connection to the groupAdhoc workload group. ELSE IF (APP_NAME() LIKE '%MANAGEMENT STUDIO%') OR (APP_NAME() LIKE '%QUERY ANALYZER%') SET @grp_name = 'groupAdhoc' -- If the application is for reporting, map the connection to the groupReports workload group. ELSE IF (APP_NAME() LIKE '%REPORT SERVER%') SET @grp_name = 'groupReports' -- If the connection does not map to any of the previous groups, put the connection into the default workload group. ELSE SET @grp_name = 'default' RETURN @grp_name END; GO -- Register the classifier user-defined function and update the -- the in-memory configuration. ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.rgclassifier_v1); GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO
參考文檔:
Resource Governor in SQL Server 2012
使用sql server 2008 資源調控器限制指定用戶查詢所使用CPU資源
CREATE RESOURCE POOL (Transact-SQL)