SQL Server是一个功能强大的关系数据库管理系统(RDBMS)。尽管已经使用多年,但总能在其中发现新的功能。遗憾的是,一些功能只有微软知道,大多数开发者并不了解。最近,遇到了一个需要快速解决的场景:一些长时间运行的查询占用了SQL Server进程分配的所有内存,影响了其他查询。幸运的是,了解到了SQL Server资源管理器这个功能,它帮助解决了问题。
SQL Server资源管理器是一个从2008年就存在的特性,但许多人并不了解它。因此,本文旨在介绍这个特性,希望它不会因为使用率低而被微软废弃。
SQL Server是一个庞大的处理引擎,它处理各种类型的工作负载,如SQL查询、事务等。为了处理这些工作负载,需要分配适当的CPU和内存资源。工作负载的性质各不相同:有些是轻量级工作负载,有些是重量级工作负载。不希望重量级SQL操作占用全部CPU和内存资源,从而影响其他操作。
实现这一点的一种方法是通过识别这些SQL查询,并限制这些查询的最大CPU和内存资源。例如,如果有一些重量级的SQL报告查询,可能会希望分配给它80%的CPU和内存资源。而对于轻量级的SQL,可能会希望只分配20%。
配置SQL Server资源管理器是一个四步过程:
步骤1:创建资源池并提供CPU和内存限制。要创建资源池,请浏览管理文件夹,右键单击资源管理器,然后单击“新建资源池”。然后,可以创建一个资源池,如下面的图所示:“资源池”。
步骤2:指定工作负载。下一步是为该资源池指定工作负载。工作负载是将池划分为逻辑部分以运行查询负载的分区。例如,假设在这个资源池“资源池”中,如果想运行SQL管理工作室和报告服务。可以创建两个工作负载分区:一个用于管理工作室,另一个用于报告服务。
步骤3:创建用户定义的函数。现在已经创建了资源池和工作负载,最后一步是将传入的SQL请求映射到适当的工作负载。这是通过使用用户定义的函数来完成的,这个函数被称为“分类函数”。
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[Class_funct]()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @workload_group sysname;
IF (APP_NAME() LIKE '%MANAGEMENT STUDIO%')
SET @workload_group = 'Managementstudio';
IF (APP_NAME() LIKE '%REPORT%')
SET @workload_group = 'Reporting';
RETURN @workload_group;
END;
步骤4:将函数分配给资源池。最后一步是将用户定义的函数分配给资源池。编辑资源池并从下拉菜单中选择函数。不要忘记启用资源管理器。
配置完成后,让测试一下是否真的有效。运行性能监视器。单击“开始”,运行,输入“perfmon”,然后按Enter。转到计数器;在计数器中,转到SQL Server资源池统计。选择所有池实例,并添加使用内存计数器。
注意:可以看到有两个额外的池:“默认”和“内部”。默认池用于所有SQL Server活动。内部池专门用于SQL服务器本身发出的内部请求。
当一个请求来到SQL Server时,它首先检查这是一个内部请求还是一个正常的最终用户请求。如果是内部请求,它直接进入内部池进行资源分配。如果是外部请求,分类函数就会起作用,检查它是什么样的工作负载,并相应地将其分配给池(参见前面文章部分中显示的用户定义的函数)。