更新时间:2024-11-12 GMT+08:00
分享

指定Stream Hashagg优化方式的Hint

功能描述

在并行的执行计划中,当算子使用的列和group by使用的列不一致,且使用hash算子时,会对计划进行重分布的优化。这时可以使用该hint控制计划的生成。

语法格式

redistribute_agg[(@queryblock)], agg_redistribute_agg[(@queryblock)]

参数说明

  • @queryblock请参见指定Hint所处于的查询块Queryblock,可省略,表示在当前查询块生效。
  • redistribute_agg指定stream hashagg使用重分布-聚合的计划。
  • agg_redistribute_agg指定stream hashagg使用聚合-重分布-聚合的计划。

示例

--准备
CREATE TABLE agg_t1 (a int, b int, c int);
set explain_perf_mode=pretty;  --打开explain pretty选项,可以看到更详尽计划
set query_dop = 2;  --设置并行度

--不使用stream agg hint
gaussdb=# EXPLAIN (costs off) SELECT /*+ scandop(agg_t1 2)*/ a, avg(b), sum(c)
    FROM agg_t1
    GROUP by a
    ORDER by 1,2,3;
 id |                         operation                         
----+-----------------------------------------------------------
  1 | ->  Sort
  2 |    ->  Streaming(type: LOCAL GATHER dop: 1/2)
  3 |       ->  HashAggregate
  4 |          ->  Streaming(type: LOCAL REDISTRIBUTE dop: 2/2)
  5 |             ->  HashAggregate
  6 |                ->  Seq Scan on agg_t1
(6 rows)

--使用redistribute_agg  hint
gaussdb=# EXPLAIN (costs off) SELECT /*+ redistribute_agg scandop(agg_t1 2)*/ a, avg(b), sum(c)
    FROM agg_t1
    GROUP BY a
    ORDER BY 1,2,3;
 id |                         operation                         
----+-----------------------------------------------------------
  1 | ->  Sort
  2 |    ->  Streaming(type: LOCAL GATHER dop: 1/2)
  3 |       ->  HashAggregate
  4 |          ->  Streaming(type: LOCAL REDISTRIBUTE dop: 2/2)
  5 |             ->  Seq Scan on agg_t1
(5 rows)

可以看到redistribute_agg hint可以使计划改为重分布-聚合,而不是聚合-重分布-聚合。

相关文档