Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

定义查询队列

当用户在 Amazon Redshift 中运行查询时,查询会路由到查询队列。每个查询队列都包含很多查询槽。每个队列都分配有一部分群集可用内存。队列的内存在队列的查询槽间分配。您可以配置每个查询队列的 WLM 属性,指定如何在槽间分配内存、如何在运行时将查询路由到特定的队列以及何时取消耗时的查询。您还可以使用 wlm_query_slot_count 参数(不同于 WLM 属性)通过分配多个槽为查询临时提供更多的内存。

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

  • 一个超级用户队列。

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

  • 一个默认用户队列。

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

查询队列在 WLM 配置中定义。WLM 配置是参数组中的可编辑参数 (wlm_json_configuration),可与一个或多个群集关联。有关更多信息,请参阅 修改 WLM 配置

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

  • 并发级别

  • 用户组

  • 查询组

  • 要使用的 WLM 内存百分比

  • WLM 超时

  • 查询监控规则

并发级别

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

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

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

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

我们建议的最佳实践是使用 15 或更低的并发级别。群集中的所有计算节点及节点上的所有切片都参与并行查询执行。提高并发数量会加剧对系统资源的争夺,从而影响整体吞吐量。

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

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

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

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

WLM 超时

要限制允许查询在给定 WLM 队列中停留的时间,您可以为每个队列设置 WLM 超时值。超时参数指定 Amazon Redshift 在取消查询前等待查询执行的时间量(单位为毫秒)。超时基于查询执行时间,不包括在队列中等待的时间。查询已进入 returning 状态时,WLM 超时不适用。要查看查询的状态,请参阅 STV_WLM_QUERY_STATE 系统表。

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

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

WLM 查询队列跳跃

如果查询因 WLM 超时而取消,WLM 会根据 WLM 队列分配规则,尝试将该查询路由或跳跃到下一个匹配的队列。如果查询不与任何其他队列定义匹配,则查询会被取消。它不会分配给默认队列。

WLM 仅跳跃 CREATE TABLE AS (CTAS) 语句和只读查询,例如 SELECT 语句。WLM 队列跳跃支持用户定义的和系统生成的 CTAS 查询。除了 CTAS 语句,系统无法跳跃用户定义的函数 (UDF) 或写入数据库的任意查询,只是将其取消。写入数据库的查询包括数据操作语言 (DML) 语句、数据定义语言 (DDL) 语句及更改数据库的命令,如 VACUUM。达到 returning WLM 状态的查询不会跳跃。要了解查询的 WLM 状态,请查看 STV_WLM_QUERY_STATE 系统表中的 STATE 列。

查询监控规则

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