很早之前就有朋友問過我,能否按業務的優先等級分配SQLServer的資源,使得不同的應用能得到不同的響應,SQLServer2008之前對這個需求貌似沒有什么 解決方法,不過從SQLServer2008開始,這個需求就變得很簡單了,SQLServer直接就為我們提供了按用戶的要求分配
很早之前就有朋友問過我,能否按業務的優先等級分配SQLServer的資源,使得不同的應用能得到不同的響應,SQLServer2008之前對這個需求貌似沒有什么
解決方法,不過從SQLServer2008開始,這個需求就變得很簡單了,SQLServer直接就為我們提供了按用戶的要求分配資源的能力,下面我們就來介紹這個功能。
SQLServer資源調控器分成三個部分:資源池、負載組和分類器函數;資源池為我們提供了將資源(CPU、Memory等)劃分到不同的載體中,負載組承載負載并
將這些負載映射到資源池,分類器函數將不同的會話映射到不同的負載組中。
資源池:
08提供了兩種預先定義好的資源池
內部池:內部池只用于SQLServer數據庫引擎,系統管理員不能改變和設置;
默認池:默認池用于沒有分配資源池的各種負載,因此,如果你不指定資源調控器,全部負載將使用默認池。默認池也不能改變或刪除,但是可以修改它的資源上
下限。
資源池上下限要求:
各個資源池的下限之和不能超過100%,因為SQLServer會盡力滿足每個下限;
上限可以設置為下限和100%之間的任意值。
以下是關于資源池的基本操作:
--創建資源池
Create Resource Pool UserQueries with(max_cpu_percent=100) --刪除資源池
drop Resource Pool UserQueries
負載組:
負載組可以讓管理員輕松地監控資源使用情況,在不同的資源池之間移動某類負載。
負載組被映射到資源池上,一個資源池可以有零個或更多負載組,一個負載組為一組用戶會話提供一個桶。
--創建負載組 Create WorkLoad Group DailyExecReports USING UserQueries; --刪除負載組 drop WorkLoad Group DailyExecReports
分類器函數:
分類器函數將接入的會話分類,并為會話的請求和查詢分配一個負載組。你可以根據連接串中的任意屬性(IP地址/應用程序名、用戶名等)分別分配組。
按以下條件分配組:
--創建資源池 Create Resource Pool AdminQueries with(max_cpu_percent=100) Create Resource Pool UserQueries with(max_cpu_percent=100) --創建負載組 Create WorkLoad Group NightlyMaintenanceTasks USING AdminQueries; Create WorkLoad Group AdhocAdmin USING AdminQueries; Create WorkLoad Group SAPUsers USING UserQueries; Create WorkLoad Group DailyExecReports USING UserQueries; --創建分類器函數 USE master GO create FUNCTION class_func_1() Returns sysname with schemabinding begin Declare @val sysname --Handle workload groups defined by login names IF SUSER_SNAME()='SAP_Login' begin SET @val='SAPUsers'; Return @val; end IF APP_NAME() like 'Microsoft SQL Server Management Studio%' begin Set @val='AdhocAdmin'; Return @val; end IF IS_MEMBER('ReportUsers')=1 begin Set @val='DailyExecReports'; Return @val; end IF CONNECTIONPROPERTY('net_transport')='Shared memory' and IS_MEMBER('NightlyAdmin')=1 begin Set @val='NightlyMaintenanceTasks'; Return @val; end Return @val; end
綁定分類器函數:
--將分類器函數綁定到資源調控器上 Alter Resource Governor With(Classifier_Function=dbo.class_func_1);
啟用和禁用分類器函數:
--啟用 ALter Resource Governor Reconfigure; --禁用 ALTER RESOURCE GOVERNOR DISABLE;
測試:
現在我們分別使用SAP_Login和sysadmin用戶調用此腳本
--測試腳本(分別使用SAP_Login和sysadmin用戶調用此腳本) set nocount on Declare @i int=100000000; Declare @s varchar(100),@count int; While @i>0 begin Select @s=@@VERSION; select @count=COUNT(0) from sys.sysobjects set @i=@i-1; end
通過性能計數器查看資源分配:
我們可以選擇性能計數器的資源統計:SQL Server:Resource Pools Stats;
我們先將資源池按一比一的比例分配:
Create Resource Pool AdminQueries with(max_cpu_percent=100) Create Resource Pool UserQueries with(max_cpu_percent=100)
運行測試腳本,顯示的CPU利用率圖如下
現在將資源分配做如下調整:
Create Resource Pool AdminQueries with(max_cpu_percent=10) Create Resource Pool UserQueries with(max_cpu_percent=90)
再次運行測試腳本,顯示的CPU利用率圖如下
可以看到,當我們調整資源后,兩個Session中運行同樣的腳本,它們所使用的資源差別很大,這樣就達到了根據不同的應用分配不同的資源的目的。
DMV查看資源池:
--查看Session所在的資源池 select s.session_id,s.login_name ,s.program_name,s.group_id,g.name from sys.dm_exec_sessions s join sys.dm_resource_governor_workload_groups g on s.group_id=g.group_id where session_id>50
--查看資源池情況 select * from sys.dm_resource_governor_resource_pools
可以看到,我們創建的兩個資源池(還有兩個是系統資源池和默認資源池),而且不同的Session對應到了不同的資源池中。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com