Amazon Redshift
数据库开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

实施手动 WLM

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

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

或者,您可以为每个查询队列配置 WLM 属性。这样可以指定如何在槽间分配内存以及如何在运行时将查询路由到特定的队列。您还可以配置 WLM 属性以取消长时间运行的查询。此外,您可以使用 wlm_query_slot_count 参数,该参数独立于 WLM 属性。此参数可以临时启用查询,通过分配多个槽来使用更多内存。

默认情况下,Amazon Redshift 配置以下查询队列:

  • 一个超级用户队列

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

  • 一个默认用户队列

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

查询队列在 WLM 配置中定义。WLM 配置是参数组中的可编辑参数 (wlm_json_configuration),可与一个或多个集群关联。有关更多信息,请参阅 Amazon Redshift Cluster Management Guide 中的配置工作负载管理

您可以向默认 WLM 配置添加其他查询队列,最多可添加八个用户队列。您可以为每个查询队列配置以下内容:

  • 并发扩展模式

  • 并发级别

  • 用户组

  • 查询组

  • 要使用的 WLM 内存百分比

  • WLM 超时

  • WLM 查询队列跳跃

  • 查询监控规则

并发扩展模式

启用并发扩展后,Amazon Redshift 会在需要时自动增加额外的集群容量来处理增多的并发读取查询。写入操作像往常一样继续在主集群上进行。不管查询在主集群上运行还是在并发扩展集群上运行,用户都将看到最新的数据。

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

并发级别

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

注意

WLM 并发级别不同于一个集群可以拥有的并行用户连接数。有关更多信息,请参阅 Amazon Redshift Cluster Management Guide 中的连接到集群

在自动 WLM 配置中,并发级别设置为 Auto (自动)。有关更多信息,请参阅实施自动 WLM

在手动 WLM 配置中,每个队列可以配置多达 50 个查询槽。所有用户定义的队列的最大 WLM 查询槽计数为 50。该限制包括默认队列,但不包括预留的超级用户队列。默认情况下,Amazon Redshift 向每个队列分配相等、固定的可用内存量。Amazon Redshift 还向队列中的每个查询槽分配相等、固定的队列内存量。分配给每个队列的内存比例通过 memory_percent_to_use 属性在 WLM 配置中定义。在运行时,您可以通过设置 wlm_query_slot_count 参数以指定分配给查询的槽数来临时覆盖分配给查询的内存量。

默认情况下,WLM 队列的并发级别为 5。在某些情况下,更高的并发级别可能对您的工作负载有用,如下所示:

  • 如果有许多小型查询被迫等待耗时的查询,则可创建一个具有更高插槽计数的独立队列,并将小型查询分配给该队列。并发级别较高的队列,分配给每个查询槽的内存较少,不过较小的查询需要的内存较少。

    注意

    如果您启用短查询加速 (SQA),WLM 会自动让短时查询优先于长时查询,因此对于大多数工作流程,不需要单独的队列来进行短查询。有关更多信息,请参阅使用短查询加速

  • 如果您有多个查询,每个查询访问单个切片上的数据,则可设置独立的 WLM 队列,以并发执行这些查询。Amazon Redshift 将并发查询分配给多个独立的切片,使多个查询能够在多个切片上并行执行。例如,如果某个查询是简单的聚合操作,且使用基于分配键的谓词,则该查询的数据将位于单个切片上。

作为最佳实践,我们建议您使用不超过 15 个总查询槽数。集群中的所有计算节点及节点上的所有切片都参与并行查询执行。提高并发数量会加剧对系统资源的争夺,从而影响整体吞吐量。

分配给每个队列的内存在该队列的查询槽间进行分配。可用于查询的内存量都是分配给运行查询的查询槽的内存。不管实际并发运行的查询数是多少都是如此。对于插槽计数为 5 时可完全在内存中运行的查询,如果将其插槽计数提高到 20,则可能需要将中间结果写入磁盘。额外的磁盘 I/O 会降低性能。

如果特定查询的内存比分配给单个查询槽的多,则可以增大 wlm_query_slot_count 参数的值,以增加可用内存。以下示例将 wlm_query_slot_count 设置为 10,执行 vacuum 操作,然后将 wlm_query_slot_count 重置为 1。

set wlm_query_slot_count to 10; vacuum; set wlm_query_slot_count to 1;

有关更多信息,请参阅 提升查询性能

用户组

您可以通过指定每个用户组的名称或使用通配符将一组用户组分配给某个队列。当所列用户组的成员运行某个查询时,该查询将在相应的队列中运行。您可以向队列分配任意数量的用户组。有关更多信息,请参阅 通配符

查询组

您可以通过指定每个队列组的名称或使用通配符将一组查询组分配给某个队列。查询组只是一种标签。在运行时,您可以将查询组标签分配给一系列查询。分配给所列查询组的任意查询都将在相应的队列中运行。您可以向队列分配任意数量的查询组。有关更多信息,请参阅 通配符

通配符

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

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

默认情况下,系统禁用通配符。

要使用的 WLM 内存百分比

在自动 WLM 配置中,内存百分比设置为 auto。有关更多信息,请参阅实施自动 WLM

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

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

WLM 超时

WLM 超时 (max_execution_time) 已弃用。相反,使用 query_execution_time 创建查询监控规则 (QMR) 来限制经过的查询执行时间。有关更多信息,请参阅 WLM 查询监控规则

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

WLM 尝试跳过 CREATE TABLE AS (CTAS) 语句和只读查询,例如 SELECT 语句。无法跳过的查询将被取消。有关更多信息,请参阅WLM 查询队列跳跃

查询已进入“returning”状态时,WLM 超时不适用。要查看查询的状态,请参阅 STV_WLM_QUERY_STATE 系统表。COPY 语句和维护操作(例如 ANALYZE 和 VACUUM)不受 WLM 超时约束。

WLM 超时功能类似于 statement_timeout 配置参数。区别在于,statement_timeout 配置参数应用于整个集群,WLM 超时特定于 WLM 配置中的单个队列。

如果还指定了 statement_timeout,则会使用 statement_timeout 和 WLM timeout (max_execution_time) 中的较小者。

查询监控规则

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