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.

ResourceGovernor.sql