Sunday, November 16, 2008 2:01 PM
Ravi S.Maniam
SQL Server 2008 - Resource Governor - Part II
Hi Friends, I was a bit caught up during these days so I could not update my blogs since a long time. Today again it is a weekend and I have some time so I am writing the article on Resource Governor Part II which is overdue since a long time.
In my first post you would have seen what is the advantage of using Resource Governor and how it works. In this post I will provide you with some sample code. The scenario is that you have one SQL Server 2008 installation and it is used by all the people in the organization. Sales people use it for querying historical sales data, senior executives use it for taking out reports and other useful data and at the same time other people use it for data entry, ad-hoc queries etc. Eventually the DBA finds that the server gets into run-away situation during peek hours. So now the DBA decides to allocate bandwidth each of these user groups.
Let's see a demo script how a DBA will do that.
NOTE : This script was written to execute well on my Laptop so please avoid copy + paste and execute on your production server. This script is provided just to help users understand the concept.
Sample Code
We will do some settings that needs to be done only once per installation. It is not same for all types of server so please refer to the Books Online before performing these settings.
|
--ONE-TIME SETTINGS
sp_configure 'show advanced', 1
GO
RECONFIGURE
GO
-- Use only 1 CPU (Laptop)
sp_configure 'affinity mask', 1
GO
RECONFIGURE
GO
-- NOTE : It is a best practice to set min & max when using Resource Governor
-- 512 MB is suitable for a Laptop Demo
sp_configure 'min server', 512
GO
sp_configure 'max server', 512
GO
RECONFIGURE
GO
-- END of ONE-TIME settings
|
We can find out the information on the Resource Governor by querying the DMVs (Dynamic Management View). These DMVs provide us with the information on the resource pools, workload groups and the classifier function.
|
/*
There will be 2 resource pools and 2 workload groups
already existing in the SQL Server when you will run this
query. Please don't change any of these.
*/
--Get the information on existing Workload Groups
SELECT * FROM sys.dm_resource_governor_workload_groups
--Get the informayion on exissting Resource Pools
SELECT * FROM sys.dm_resource_governor_resource_pools
--Get the information on existing classifier function (if any)
SELECT * FROM sys.dm_resource_governor_configuration
GO
|
Now we will create two Resource Pools first.
|
/*
We will create 2 Resource Pools for the Users
1) PoolAdhoc for Generic Users
2) PoolExec for Company Executives
*/
-- Create User pools
CREATE RESOURCE POOL PoolAdhoc
GO
CREATE RESOURCE POOL PoolExec
GO
|
After creating the Resource Pools we will create the Workload Groups and these Workload Groups will be assigned to respective Resource Pools.
|
/*
We will create 3 Workload Groups
1) GrpMarketing for Marketing Department Users
2) GrpGeneric for Generic Ad-Hoc query users
3) GrpExec for the Top Level Executives
..and assign them to respective resource pools
1) GrpMarketing to PoolAdhoc
2) GrpGeneric to PoolAdhoc
3) GrpExec to PoolExec
*/
CREATE WORKLOAD GROUP GrpMarketing
USING PoolAdhoc
GO
CREATE WORKLOAD GROUP GrpGeneric
USING PoolAdhoc
GO
CREATE WORKLOAD GROUP GrpExec
USING PoolExec
GO
|
In the next step we will create SQL User Logins.
|
/*
Now we will create 3 user logins for 3 different class
of users.
1) UserMarketing for Marketing Department
2) UserGeneric for Generic Users
3) UserExec for Senior Executives
*/
-- create logins to separate users into different groups
CREATE LOGIN UserMarketing WITH PASSWORD = 'UserMarketing1', CHECK_POLICY = OFF
CREATE LOGIN UserGeneric WITH PASSWORD = 'UserGeneric1', CHECK_POLICY = OFF
CREATE LOGIN UserExec WITH PASSWORD = 'UserExec1', CHECK_POLICY = OFF
GO
|
Now when the user logins are created our next task is to create a Classifier Function. Classifier function tells the Resource Governor on how to handle the incoming request. The classifier function has to be created in the Master database. After the creation of the classifier function we have to make the Resource Governor aware of this function.
|
/*
We would create classifier function now.
This classifier function has to be created in the
MASTER Database. Please make sure to select the
Master Database
*/
USE master
GO
CREATE FUNCTION RGClassifier()
RETURNS SYSNAME WITH SCHEMABINDING
BEGIN
DECLARE @val varchar(32)
if 'UserExec' = SUSER_SNAME()
SET @val = 'GrpExec';
else if 'UserGeneric' = SUSER_SNAME()
SET @val = 'GrpGeneric';
else if 'UserMarketing' = SUSER_SNAME()
SET @val = 'GrpGeneric';
return @val;
END
GO
-- Make this function
-- known to the Resource Governor
ALTER RESOURCE GOVERNOR
WITH (CLASSIFIER_FUNCTION = dbo.RGClassifier)
GO
|
Now we can set the priority of the Workload Group or the CPU usage by any Resource Pools etc. as demonstrated in the query below.
|
-- Adjust PoolAdhoc to not consume more than 50% of CPU
ALTER RESOURCE POOL PoolAdhoc
WITH (MAX_CPU_PERCENT = 50)
GO
-- Make the changes effective
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
-- Adjust PoolExec to not consume more than 30% of CPU
ALTER RESOURCE POOL PoolExec
WITH (MAX_CPU_PERCENT = 30)
GO
-- Make the changes effective
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
-- Alter importance of GrpGeneric
ALTER WORKLOAD GROUP GrpGeneric
WITH (IMPORTANCE = Low)
GO
-- make the changes effective
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
-- Alter importance of GrpMarketing
ALTER WORKLOAD GROUP GrpMarketing
WITH (IMPORTANCE = High)
GO
-- Make the changes effective
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
|
That is all in this post from my side. If you have any feedbacks then please feel free to share it with me over email.