实施自动 WLM
使用自动工作负载管理 (WLM),Amazon Redshift 管理查询并发性和内存分配。您可以使用服务类标识符 100-107 创建最多八个队列。每个队列都有一个优先级。有关更多信息,请参阅 查询优先级。
自动 WLM 确定查询所需的资源量,并根据工作负载调整并发性。当系统中有查询需要大量资源(例如,较大表之间的哈希联接)时,并发性较低。当提交了较轻量的查询(例如,插入、删除、扫描或简单聚合)时,并发性较高。
自动 WLM 与短查询加速 (SQA) 分开,它以不同方式评估查询。自动 WLM 和 SQA 协同工作,即使长时间运行、资源密集型的查询处于活动状态,也可以完成短期运行和轻量级查询。有关 SQA 的更多信息,请参阅短查询加速。
Amazon Redshift 通过参数组启用自动 WLM:
如果您的集群使用默认参数组,则 Amazon Redshift 为它们启用自动 WLM。
如果您的集群使用自定义参数组,可以配置您的集群以启用自动 WLM。我们建议您为自动 WLM 配置创建单独的参数组。
要配置 WLM,请编辑参数组中可与一个或多个集群关联的 wlm_json_configuration
参数。有关更多信息,请参阅 修改 WLM 配置。
您可以在 WLM 配置中定义查询队列。您可以向默认 WLM 配置添加其他查询队列,最多可添加八个用户队列。您可以为每个查询队列配置以下内容:
-
优先级
-
并发扩展模式
-
用户组
-
查询组
-
查询监控规则
优先级
您可以通过设置优先级值来定义查询在工作负载中的相对重要性。为队列指定优先级,并由与队列关联的所有查询继承。有关更多信息,请参阅 查询优先级。
并发扩展模式
启用并发扩展后,Amazon Redshift 会在需要时自动增加额外的集群容量来处理增多的并发读取查询。不管查询在主集群上运行还是在并发扩展集群上运行,用户都将看到最新的数据。
您可以通过配置 WLM 队列来管理将哪些查询发送到并发扩展集群。为队列启用并发扩展后,符合条件的查询将发送到并发扩展集群,而不是排队等待。有关更多信息,请参阅 并发扩展。
用户组
您可以通过指定每个用户组的名称或使用通配符将一组用户组分配给某个队列。当所列用户组的成员运行某个查询时,该查询将在相应的队列中运行。您可以向队列分配任意数量的用户组。有关更多信息,请参阅 根据用户组为队列分配查询。
查询组
您可以通过指定每个队列组的名称或使用通配符将一组查询组分配给某个队列。查询组 只是一种标签。在运行时,您可以将查询组标签分配给一系列查询。分配给所列查询组的任意查询都将在相应的队列中运行。您可以向队列分配任意数量的查询组。有关更多信息,请参阅 为查询组分配查询。
通配符
如果在 WLM 队列配置中启用了通配符,则可以单独地或使用 Unix shell 样式的通配符向队列分配用户组和查询组。模式匹配不区分大小写。
例如,“*”通配符字符匹配任意数量的字符。因此,如果您将 dba_*
添加到某个队列的用户组列表中,则属于名称以开头的 dba_
组的所有用户查询都将分配到该队列。示例包括 dba_admin
或 DBA_primary
。“?”通配符匹配任意单个字符。因此,如果队列包括用户组 dba?1
,则名为 dba11
和 dba21
的用户组匹配,但 dba12
不匹配。
默认情况下,未启用通配符。
查询监控规则
查询监控规则为 WLM 查询定义基于指标的性能界限,并指定在查询超出这些界限时需要采取的操作。例如,对于短时间运行查询专用的队列,您可创建取消运行超过 60 秒的查询的规则。要跟踪设计不佳的查询,您可创建记录包含嵌套循环的查询的其他规则。有关更多信息,请参阅 WLM 查询监控规则。
检查自动 WLM
要检查是否启用了自动 WLM,请运行以下查询。如果查询返回至少一行内容,则说明自动 WLM 已启用。
select * from stv_wlm_service_class_config where service_class >= 100;
以下查询显示遍历每个查询队列(服务类)的查询数量。它还显示平均执行时间、等待时间排在第九十百分位数的查询数量以及平均等待时间。自动 WLM 查询使用服务类 100 到 107。
select final_state, service_class, count(*), avg(total_exec_time), percentile_cont(0.9) within group (order by total_queue_time), avg(total_queue_time) from stl_wlm_query where userid >= 100 group by 1,2 order by 2,1;
要查明自动 WLM 运行并成功完成哪些查询,请运行以下查询。
select a.queue_start_time, a.total_exec_time, label, trim(querytxt) from stl_wlm_query a, stl_query b where a.query = b.query and a.service_class >= 100 and a.final_state = 'Completed' order by b.query desc limit 5;