

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 实施手动 WLM
<a name="cm-c-defining-query-queues"></a>

通过手动 WLM，您可以通过修改 WLM 配置，为耗时查询和短时查询分别创建队列，来管理系统性能和用户体验。

当用户在 Amazon Redshift 中运行查询时，查询会路由到查询队列。每个查询队列都包含很多查询槽。每个队列都分配有一部分集群可用内存。队列的内存在队列的查询槽间分配。您可以允许 Amazon Redshift 通过自动 WLM 管理查询并发性。有关更多信息，请参阅 [实施自动 WLM](automatic-wlm.md)。

或者，您可以为每个查询队列配置 WLM 属性。这样可以指定如何在槽间分配内存，以及如何在运行时将查询路由到特定的队列。您还可以配置 WLM 属性以取消长时间运行的查询。

预设情况下，Amazon Redshift 配置以下查询队列：
+  **一个超级用户队列** 

  超级用户队列是专为超级用户预留的队列，无法进行配置。仅在需要运行影响系统的查询或用于故障排除目的时，才应使用该队列。例如，如果需要取消用户的耗时查询或向数据库添加用户，则可使用该队列。请不要使用它来执行常规查询。该队列不显示在控制台中，但在数据库的系统表中显示为第五队列。要在超级用户队列中运行查询，用户必须以超级用户身份登录并使用预定义的 `superuser` 查询组运行查询。
+  **一个默认用户队列** 

  默认队列初始配置为并发运行五个查询。在使用手动 WLM 时，您可以更改默认队列的并发、超时和内存分配属性，但不能指定用户组或查询组。默认队列必须是 WLM 配置中最后一个队列。未路由到其他队列的查询在默认队列中运行。

查询队列在 WLM 配置中定义。WLM 配置是参数组中的可编辑参数 (`wlm_json_configuration`)，可与一个或多个集群关联。有关更多信息，请参阅《Amazon Redshift 管理指南》**中的[配置工作负载管理](https://docs.amazonaws.cn/redshift/latest/mgmt/workload-mgmt-config.html)。

您可以向默认 WLM 配置添加其他查询队列，最多可添加八个用户队列。您可以为每个查询队列配置以下内容：
+ 并发扩展模式 
+ 并发级别 
+ 用户组 
+ 查询组 
+ 要使用的 WLM 内存百分比
+ WLM 超时
+ WLM 查询队列跳过
+ 查询监控规则

## 并发扩展模式
<a name="concurrency-scaling-mode"></a>

启用并发扩展后，Amazon Redshift 会在需要时自动增加额外的集群容量来处理增多的并发读取查询。不管查询在主集群上运行还是在并发扩展集群上运行，用户都将看到最新的数据。

您可以通过配置 WLM 队列来管理将哪些查询发送到并发扩展集群。为队列启用并发扩展后，符合条件的查询将发送到并发扩展集群，而不是排队等待。有关更多信息，请参阅 [并发扩展](concurrency-scaling.md)。

## 并发级别
<a name="cm-c-defining-query-queues-concurrency-level"></a>

队列中的查询以并发方式运行，直到它们达到为该队列定义的 WLM 队列插槽计数或*并发* 级别。达到并发级别后，后续查询将在队列中等待。

**注意**  
WLM 并发级别不同于一个集群可以拥有的并行用户连接数。有关更多信息，请参阅《Amazon Redshift 管理指南》**中的[连接到集群](https://docs.amazonaws.cn/redshift/latest/mgmt/connecting-to-cluster.html)。

在自动 WLM 配置（推荐）中，并发级别设置为**自动**。Amazon Redshift 为查询动态分配内存，这会随之确定同时运行多少个查询。此数量基于运行查询和排队查询所需的资源。自动 WLM 不可配置。有关更多信息，请参阅 [实施自动 WLM](automatic-wlm.md)。

在手动 WLM 配置中，Amazon Redshift 向每个队列静态分配固定数量的内存。队列的内存在查询槽之间均匀分配。举例来说，如果向队列分配了 20% 的集群内存并且有 10 个插槽，则每个查询将分配 2% 的集群内存。内存分配保持固定，不论并行运行的查询数量是多少。由于此固定内存分配，对于插槽计数为 5 时可完全在内存中运行的查询，如果将其插槽计数提高到 20，则可能需要将中间结果写入磁盘。在这个例子中，每个查询的队列内存份额从 1/5 减少到 1/20。额外的磁盘 I/O 会降低性能。

所有用户定义的队列的最大插槽计数为 50。这限制了所有队列的总插槽数，包括默认队列。唯一不受此限制的队列是预留的超级用户队列。

默认情况下，手动 WLM 队列的并发级别为 5。在某些情况下，更高的并发级别可能对您的工作负载有用，如下所示：
+ 如果有许多小型查询被迫等待耗时的查询，则可创建一个具有更高插槽计数的独立队列，并将小型查询分配给该队列。并发级别较高的队列，分配给每个查询槽的内存较少，不过较小的查询需要的内存较少。
**注意**  
如果您启用短查询加速 (SQA)，WLM 会自动让短时查询优先于长时查询，因此对于大多数工作流程，不需要单独的队列来进行短查询。有关更多信息，请参阅 [短查询加速](wlm-short-query-acceleration.md)。
+ 如果您有多个查询，每个查询访问单个切片上的数据，则可设置独立的 WLM 队列，以并发执行这些查询。Amazon Redshift 将并发查询分配给多个独立的切片，使多个查询能够在多个切片上并行执行。例如，如果某个查询是简单的聚合操作，且使用基于分配键的谓词，则该查询的数据将位于单个切片上。

### 手动 WLM 示例
<a name="cm-c-defining-query-queues-concurrency-level-example"></a>

 此示例是一个简单的手动 WLM 场景，显示了如何分配插槽和内存。您对以下三个队列实施手动 WLM：
+ *data-ingestion 队列* – 此队列设置用于提取数据。为该队列分配了 20% 的集群内存，并且该队列有 5 个插槽。因此，队列中可以同时运行 5 个查询，每个查询分配了 4% 的集群内存。
+ *data-scientist 队列* – 专为内存密集型查询设计。为该队列分配了 40% 的集群内存，并且该队列有 5 个插槽。因此可以同时运行 5 个查询，每个查询分配了 8% 的集群内存。
+ *default 队列* – 这是为组织中大多数用户设计的队列。包括销售和会计团队，他们会运行短时间或中等时间长度且并不复杂的查询。为该队列分配了 40% 的集群内存，并且该队列有 40 个插槽。此队列中可以同时运行 40 个查询，每个查询分配了 1% 的集群内存。这是可以为此队列分配的最大插槽数，因为所有队列的总数限制为 50。

如果您正在运行 WLM，并且工作负载需要并行运行 15 个以上的查询，我们建议您启用并发扩展。这是因为将查询槽数增加到 15 以上可能会导致系统资源争用，限制了单个集群的总吞吐量。利用并发扩展，您可以并行运行数百个查询，最多可达到配置的并发扩展集群数。并发扩展集群的数量由 [max\$1concurrency\$1scaling\$1clusters](r_max_concurrency_scaling_clusters.md) 控制。有关并发扩展的更多信息，请参阅[并发扩展](concurrency-scaling.md)。

有关更多信息，请参阅 [查询性能改进](query-performance-improvement-opportunities.md)。

## 用户组
<a name="cm-c-defining-query-queues-user-groups"></a>

您可以通过指定每个用户组的名称或使用通配符将一组用户组分配给某个队列。当所列用户组的成员运行某个查询时，该查询将在相应的队列中运行。您可以向队列分配任意数量的用户组。有关更多信息，请参阅 [根据用户组为队列分配查询](cm-c-executing-queries.md#cm-c-executing-queries-assigning-queries-to-queues-based-on-user-groups)。

## 用户角色
<a name="cm-c-defining-query-queues-user-roles"></a>

您可以通过指定每个用户角色的名称或使用通配符将一组用户角色分配给某个队列。当所列用户角色的成员运行某个查询时，该查询将在相应的队列中运行。您可以向队列分配任意数量的用户角色。有关更多信息，请参阅 [根据用户角色为队列分配查询](cm-c-executing-queries.md#cm-c-executing-queries-assigning-queries-to-queues-based-on-user-roles)。

## 查询组
<a name="cm-c-defining-query-queues-query-groups"></a>

您可以通过指定每个队列组的名称或使用通配符将一组查询组分配给某个队列。查询组只是一种标签。在运行时，您可以将查询组标签分配给一系列查询。分配给所列查询组的任意查询都将在相应的队列中运行。您可以向队列分配任意数量的查询组。有关更多信息，请参阅 [为查询组分配查询](cm-c-executing-queries.md#cm-c-executing-queries-assigning-a-query-to-a-query-group)。

## 通配符
<a name="wlm-wildcards"></a>

如果在 WLM 队列配置中启用了通配符，则可以单独地或使用 Unix shell 样式的通配符向队列分配用户组和查询组。模式匹配不区分大小写。

例如，“\$1”通配符字符匹配任意数量的字符。因此，如果您将 `dba_*` 添加到某个队列的用户组列表中，则属于名称以开头的 `dba_` 组的所有用户查询都将分配到该队列。示例包括 `dba_admin` 或 `DBA_primary`。“?”通配符匹配任意单个字符。因此，如果队列包括用户组 `dba?1`，则名为 `dba11` 和 `dba21` 的用户组匹配，但 `dba12` 不匹配。

默认情况下，通配符处于关闭状态。

## 要使用的 WLM 内存百分比
<a name="wlm-memory-percent"></a>

在自动 WLM 配置中，内存百分比设置为 **auto**。有关更多信息，请参阅 [实施自动 WLM](automatic-wlm.md)。

在手动 WLM 配置中，要指定分配给查询的可用内存量，您可以设置 `WLM Memory Percent to Use` 参数。默认情况下，会向每个用户定义队列分配相等的用户定义查询可用内存。例如，如果有四个用户定义队列，则会向每个队列分配 25% 的可用内存。超级用户队列有自己的分配内存，无法进行修改。要更改分配，您可以向每个队列分配整数比例的内存，总计最高为 100%。任意未分配的内存将由 Amazon Redshift 进行管理，如果有队列请求更多内存以进行处理，可以临时分配给该队列。

例如，如果配置了四个队列，则可以按以下方式分配内存：20%、30%、15%、15%。其余的 20% 未分配，由该服务管理。

## WLM 超时
<a name="wlm-timeout"></a>

WLM 超时 (`max_execution_time`) 已弃用。相反，使用 `query_execution_time` 创建查询监控规则 (QMR) 来限制经过的查询执行时间。有关更多信息，请参阅 [WLM 查询监控规则](cm-c-wlm-query-monitoring-rules.md)。

要限制允许查询在给定 WLM 队列中停留的时间，您可以为每个队列设置 WLM 超时。超时参数指定 Amazon Redshift 在取消或跳过查询前等待查询执行的时间量（单位为毫秒）。超时基于查询执行时间，不包括在队列中等待的时间。

WLM 尝试跳过 [CREATE TABLE AS](r_CREATE_TABLE_AS.md) (CTAS) 语句和只读查询，例如 SELECT 语句。无法跳过的查询将被取消。有关更多信息，请参阅 [WLM 查询队列跳过](wlm-queue-hopping.md)。

查询已进入“returning”状态时，WLM 超时不适用。要查看查询的状态，请参阅 [STV\$1WLM\$1QUERY\$1STATE](r_STV_WLM_QUERY_STATE.md) 系统表。COPY 语句和维护操作（例如 ALTER、ANALYZE 和 VACUUM）不受 WLM 超时约束。

WLM 超时功能类似于 [statement\$1timeout](r_statement_timeout.md) 配置参数。区别在于，`statement_timeout` 配置参数应用于整个集群，WLM 超时特定于 WLM 配置中的单个队列。

如果还指定了 [statement\$1timeout](r_statement_timeout.md)，则会使用 statement\$1timeout 和 WLM timeout (max\$1execution\$1time) 中的较小者。

## 查询监控规则
<a name="wlm-query-monitoring-rules"></a>

查询监控规则为 WLM 查询定义基于指标的性能界限，并指定在查询超出这些界限时需要采取的操作。例如，对于短时间运行查询专用的队列，您可创建取消运行超过 60 秒的查询的规则。要跟踪设计不佳的查询，您可创建记录包含嵌套循环的查询的其他规则。有关更多信息，请参阅 [WLM 查询监控规则](cm-c-wlm-query-monitoring-rules.md)。