第 4 节:使用 wlm_query_slot_count 临时覆盖队列中的并发级别 - Amazon Redshift

第 4 节:使用 wlm_query_slot_count 临时覆盖队列中的并发级别

有时,用户可能会为某个特定查询临时需要更多资源。如果是这样的话,他们可以使用 wlm_query_slot_count 配置设置来临时覆盖查询队列中分配槽位的方式。槽位 是用于处理查询的内存和 CPU 的单位。您可在偶尔使用消耗集群中大量资源的查询时(例如,在数据库中执行 VACUUM 操作时)覆盖槽位计数。

您可能会发现用户经常需要针对特定类型的查询设置 wlm_query_slot_count。如果是,请考虑调整 WLM 配置并为用户提供更适合其查询需求的队列。有关通过使用槽位计数临时覆盖并发级别的更多信息,请参阅wlm_query_slot_count

步骤 1:使用 wlm_query_slot_count 覆盖并发级别

在本教程中,我们将运行同一个长时间运行的 SELECT 查询。我们将以 adminwlm 用户的身份运行查询,并使用 wlm_query_slot_count 增加查询的可用槽位数。

使用 wlm_query_slot_count 覆盖并发级别

  1. 提高对查询的限制以确保您有足够的时间来查询 WLM_QUERY_STATE_VW 视图并查看结果。

    set wlm_query_slot_count to 3; select avg(l.priceperticket*s.qtysold) from listing l, sales s where l.listid <40000;
  2. 现在,可使用管理员用户查询 WLM_QUERY_STATE_VW,以查看查询的运行情况。

    select * from wlm_query_state_vw;

    下面是示例结果。

    请注意,查询的槽位计数是 3。此计数表示查询正在使用所有三个槽位来处理查询,并将队列中的所有资源分配给查询。

  3. 现在,运行以下查询。

    select * from WLM_QUEUE_STATE_VW;

    下面是示例结果。

    wlm_query_slot_count 配置设置仅对当前会话有效。如果会话过期或者另一用户运行查询,则使用 WLM 配置。

  4. 重置槽位计数并重新运行测试。

    reset wlm_query_slot_count; select avg(l.priceperticket*s.qtysold) from listing l, sales s where l.listid <40000;

    以下是示例结果。

步骤 2:从不同的会话中运行查询

接下来,从不同会话中运行查询。

从不同的会话中运行查询

  1. 在 RSQL 窗口 1 和 2 中,运行以下查询以使用测试查询组。

    set query_group to test;
  2. 在 RSQL 窗口 1 中,运行以下长时间运行的查询。

    select avg(l.priceperticket*s.qtysold) from listing l, sales s where l.listid <40000;
  3. 由于长时间运行的查询仍在 RSQL 窗口 1 中运行,请运行以下查询。这些命令将增加槽位计数,以使用队列的所有槽位,然后开始运行长时间运行的查询。

    set wlm_query_slot_count to 2; select avg(l.priceperticket*s.qtysold) from listing l, sales s where l.listid <40000;
  4. 打开第三个 RSQL 窗口并查询视图以查看结果。

    select * from wlm_queue_state_vw; select * from wlm_query_state_vw;

    以下是示例结果。

    请注意,第一个查询正在使用分配给队列 1 的槽位之一来运行查询。此外,请注意,队列中有一个查询正在等待(其中 queued1stateQueuedWaiting)。在第一个查询完成之后,第二个查询即会开始运行。此执行发生的原因在于:两个查询均已路由至 test 查询组,而且第二个查询必须等待有足够多的槽位才能开始进行处理。