很早之前就有朋友問(wèn)過(guò)我,能否按業(yè)務(wù)的優(yōu)先等級(jí)分配SQLServer的資源,使得不同的應(yīng)用能得到不同的響應(yīng),SQLServer2008之前對(duì)這個(gè)需求貌似沒(méi)有什么 解決方法,不過(guò)從SQLServer2008開始,這個(gè)需求就變得很簡(jiǎn)單了,SQLServer直接就為我們提供了按用戶的要求分配
很早之前就有朋友問(wèn)過(guò)我,能否按業(yè)務(wù)的優(yōu)先等級(jí)分配SQLServer的資源,使得不同的應(yīng)用能得到不同的響應(yīng),SQLServer2008之前對(duì)這個(gè)需求貌似沒(méi)有什么
解決方法,不過(guò)從SQLServer2008開始,這個(gè)需求就變得很簡(jiǎn)單了,SQLServer直接就為我們提供了按用戶的要求分配資源的能力,下面我們就來(lái)介紹這個(gè)功能。
SQLServer資源調(diào)控器分成三個(gè)部分:資源池、負(fù)載組和分類器函數(shù);資源池為我們提供了將資源(CPU、Memory等)劃分到不同的載體中,負(fù)載組承載負(fù)載并
將這些負(fù)載映射到資源池,分類器函數(shù)將不同的會(huì)話映射到不同的負(fù)載組中。
資源池:
08提供了兩種預(yù)先定義好的資源池
內(nèi)部池:內(nèi)部池只用于SQLServer數(shù)據(jù)庫(kù)引擎,系統(tǒng)管理員不能改變和設(shè)置;
默認(rèn)池:默認(rèn)池用于沒(méi)有分配資源池的各種負(fù)載,因此,如果你不指定資源調(diào)控器,全部負(fù)載將使用默認(rèn)池。默認(rèn)池也不能改變或刪除,但是可以修改它的資源上
下限。
資源池上下限要求:
各個(gè)資源池的下限之和不能超過(guò)100%,因?yàn)镾QLServer會(huì)盡力滿足每個(gè)下限;
上限可以設(shè)置為下限和100%之間的任意值。
以下是關(guān)于資源池的基本操作:
--創(chuàng)建資源池
Create Resource Pool UserQueries with(max_cpu_percent=100) --刪除資源池
drop Resource Pool UserQueries
負(fù)載組:
負(fù)載組可以讓管理員輕松地監(jiān)控資源使用情況,在不同的資源池之間移動(dòng)某類負(fù)載。
負(fù)載組被映射到資源池上,一個(gè)資源池可以有零個(gè)或更多負(fù)載組,一個(gè)負(fù)載組為一組用戶會(huì)話提供一個(gè)桶。
--創(chuàng)建負(fù)載組 Create WorkLoad Group DailyExecReports USING UserQueries; --刪除負(fù)載組 drop WorkLoad Group DailyExecReports
分類器函數(shù):
分類器函數(shù)將接入的會(huì)話分類,并為會(huì)話的請(qǐng)求和查詢分配一個(gè)負(fù)載組。你可以根據(jù)連接串中的任意屬性(IP地址/應(yīng)用程序名、用戶名等)分別分配組。
按以下條件分配組:
--創(chuàng)建資源池 Create Resource Pool AdminQueries with(max_cpu_percent=100) Create Resource Pool UserQueries with(max_cpu_percent=100) --創(chuàng)建負(fù)載組 Create WorkLoad Group NightlyMaintenanceTasks USING AdminQueries; Create WorkLoad Group AdhocAdmin USING AdminQueries; Create WorkLoad Group SAPUsers USING UserQueries; Create WorkLoad Group DailyExecReports USING UserQueries; --創(chuàng)建分類器函數(shù) 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
綁定分類器函數(shù):
--將分類器函數(shù)綁定到資源調(diào)控器上 Alter Resource Governor With(Classifier_Function=dbo.class_func_1);
啟用和禁用分類器函數(shù):
--啟用 ALter Resource Governor Reconfigure; --禁用 ALTER RESOURCE GOVERNOR DISABLE;
測(cè)試:
現(xiàn)在我們分別使用SAP_Login和sysadmin用戶調(diào)用此腳本
--測(cè)試腳本(分別使用SAP_Login和sysadmin用戶調(diào)用此腳本) 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
通過(guò)性能計(jì)數(shù)器查看資源分配:
我們可以選擇性能計(jì)數(shù)器的資源統(tǒng)計(jì):SQL Server:Resource Pools Stats;
我們先將資源池按一比一的比例分配:
Create Resource Pool AdminQueries with(max_cpu_percent=100) Create Resource Pool UserQueries with(max_cpu_percent=100)
運(yùn)行測(cè)試腳本,顯示的CPU利用率圖如下
現(xiàn)在將資源分配做如下調(diào)整:
Create Resource Pool AdminQueries with(max_cpu_percent=10) Create Resource Pool UserQueries with(max_cpu_percent=90)
再次運(yùn)行測(cè)試腳本,顯示的CPU利用率圖如下
可以看到,當(dāng)我們調(diào)整資源后,兩個(gè)Session中運(yùn)行同樣的腳本,它們所使用的資源差別很大,這樣就達(dá)到了根據(jù)不同的應(yīng)用分配不同的資源的目的。
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
可以看到,我們創(chuàng)建的兩個(gè)資源池(還有兩個(gè)是系統(tǒng)資源池和默認(rèn)資源池),而且不同的Session對(duì)應(yīng)到了不同的資源池中。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com