视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
SQLServer资源器
2020-11-09 07:37:50 责编:小采
文档


很早之前就有朋友问过我,能否按业务的优先等级分配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地址/应用程序名、用户名等)分别分配组。

按以下条件分配组:

  • 一个用户接入并使用SAP_Login登录名,则为他分配SAPUsers负载组;
  • 一个用户接入程序名是SSMS,则让它成为AdhocAdmin负载组的一员;
  • 一个用户是ReportUsers组一员,则让它成为DaliyExecReports负载组一员;
  • 一个用户以共享内存连接,并在NightlyAdmin用户组中,则分配NightlyMaintanceTask组。
  • --创建资源池
    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对应到了不同的资源池中。

    下载本文
    显示全文
    专题