你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Synapse Analytics 中专用 SQL 池的工作负荷分类

本文介绍了工作负荷分类过程,即使用 Azure Synapse 中的专用 SQL 池,向传入请求分配工作负荷组和重要性。

分类

使用工作负荷管理分类可以通过分配资源类重要性对请求应用工作负荷策略。

可通过多种方法来分类数据仓库工作负荷,而最简单且最常用的分类方法是加载和查询。 可以使用 insert、update 和 delete 语句加载数据。 可以使用 select 查询数据。 数据仓库解决方案通常对加载活动使用工作负荷策略,例如,分配具有更多资源的更高资源类。 可对查询应用不同的工作负荷策略,例如,分配比加载活动更低的重要性。

还可以将加载和查询工作负荷进一步分类。 进一步分类能够更好地控制工作负荷。 例如,查询工作负荷可能包括多维数据集刷新、仪表板查询或即席查询。 可以使用不同的资源类或重要性设置将其中的每个查询工作负荷分类。 加载活动也可以受益于进一步分类。 可将大型转换分配到较大的资源类。 可以使用较高的重要性来确保先加载重要销售数据,再加载天气数据或社交数据馈送。

不会对所有语句分类,因为它们不需要会影响执行的资源或重要因素。 DBCC 命令、BEGIN、COMMIT 和 ROLLBACK TRANSACTION 语句不会进行分类。

分类过程

目前,对专用 SQL 池进行分类是这样实现的:使用 sp_addrolemember 将用户分配给具有相应资源类的角色。 使用此功能时,将请求特征化,使之超出资源类登录范围的能力会受到限制。 现在,可以通过 CREATE WORKLOAD CLASSIFIER 语法来利用更丰富的分类方法。 使用此语法,专用 SQL 池用户可以通过 workload_group 参数为请求分配重要性和系统资源数。

分类权重

在分类过程中,将使用权重来确定分配哪个工作负荷组。 权重如下所示:

分类器参数 权重
MEMBERNAME:USER 64
MEMBERNAME:ROLE 32
WLM_LABEL 16
WLM_CONTEXT 8
START_TIME/END_TIME 4

membername 参数是必需的。 但是,如果指定的 membername 是数据库用户而不是数据库角色,用户的权重更高,因此选择该分类器。

如果某个用户是多个角色的成员,并且这些角色分配有不同的资源类或者在多个分类器中相匹配,则会为该用户分配最高的资源类。 此行为与现有的资源类分配行为保持一致。

备注

对托管标识 (MI) 进行分类的行为在 Azure Synapse 工作区中的专用 SQL 池和独立专用 SQL 池(原 SQL DW)之间有所区别。 虽然独立专用 SQL 池 MI 维护分配的标识,但对于 Azure Synapse 工作区,MI 作为 dbo 运行。 这无法更改。 默认情况下,dbo 角色归为 smallrc 类别。 为 dbo 角色创建分类器后,可将请求分配给 smallrc 外的其他工作负载组。 如果单是 dbo 对于分类来说太过宽泛,并且影响范围较广,可考虑将基于标签、会话或时间的分类与 dbo 角色分类结合使用。

系统分类器

工作负荷分类采用系统工作负荷分类器。 系统分类器将现有的资源类角色成员身份映射到具有一般重要性的资源类资源分配。 无法删除系统分类器。 若要查看系统分类器,可运行以下查询:

SELECT * FROM sys.workload_management_workload_classifiers where classifier_id <= 12

混合使用资源类分配和分类器

使用自动创建的系统分类器能够轻松迁移到工作负荷分类。 开始创建具有重要性的新分类器时,使用具有分类优先顺序的资源类角色映射可能会导致错误分类。

假设出现了下面这种情景:

  • 某个现有的数据仓库包含已分配到 largerc 资源类角色的数据库用户 DBAUser。 资源类分配是使用 sp_addrolemember 进行的。
  • 现已使用工作负荷管理更新该数据仓库。
  • 为了测试新的分类语法,为数据库角色 DBARole(DBAUser 是其成员)创建了一个分类器(用于将用户映射到 mediumrc),并且该角色具有较高的重要性。
  • 当 DBAUser 登录并运行查询时,该查询将分配到 largerc, 因为用户优先于角色成员身份。

为了简化分类错误的排查,我们建议在创建工作负荷分类器时删除资源类角色映射。 以下代码返回现有的资源类角色成员身份。 针对相应资源类返回的每个成员名称运行 sp_droprolemember

SELECT  r.name AS [Resource Class]
,       m.name AS membername
FROM    sys.database_role_members rm
JOIN    sys.database_principals AS r ON rm.role_principal_id = r.principal_id
JOIN    sys.database_principals AS m ON rm.member_principal_id = m.principal_id
WHERE   r.name IN ('mediumrc','largerc','xlargerc','staticrc10','staticrc20','staticrc30','staticrc40','staticrc50','staticrc60','staticrc70','staticrc80');
--for each row returned run in the previous query
EXEC sp_droprolemember '[Resource Class]', membername;

后续步骤