更新时间:2025-05-29 GMT+08:00

MergeAppend

算子说明

MergeAppend用于多个有序关系集合的追加,操作类似于Append,只是通过归并的方式对有序关系的集合进行加速运算。MergeAppend以保留排序顺序的方式对子查询结果进行组合,可用于组合表分区中已排序的行。因此,与普通Append不同,MergeAppend在执行操作之前需要确保输入的 m_plan 是有序的。通常,在MergeAppend操作之前(即执行计划的子树中)会出现排序算子 Sort。

典型场景

当分区扫描路径为Index或Index Only,且分区剪枝结果大于1,并且满足以下条件时。

所有分区索引均为有效的B-tree索引;SQL查询含Limit子句;分区扫描时,不存在带Filter的分区表查询语句。

当GUC参数sql_beta_feature = 'disable_merge_append_partition'时,不再生成MergeAppend路径。

示例

-- 数据准备。 
gaussdb=# CREATE TABLE test_range_pt (a INT, b INT, c INT)
 DISTRIBUTE BY REPLICATION
 PARTITION BY RANGE(a)
 (
     PARTITION p1 VALUES LESS THAN (2000),
     PARTITION p2 VALUES LESS THAN (3000),
     PARTITION p3 VALUES LESS THAN (4000),
     PARTITION p4 VALUES LESS THAN (5000),
     PARTITION p5 VALUES LESS THAN (MAXVALUE)
 )ENABLE ROW MOVEMENT;
CREATE TABLE
gaussdb=# INSERT INTO test_range_pt VALUES (generate_series(1,10000),generate_series(1,10000),generate_series(1,10000));
INSERT 0 10000
gaussdb=# CREATE INDEX idx_range_b ON test_range_pt(b) GLOBAL;
CREATE INDEX
gaussdb=# ANALYZE test_range_pt;
ANALYZE

--执行结果。 
gaussdb=# EXPLAIN SELECT * FROM test_range_pt UNION ALL SELECT * FROM test_range_pt order by b limit 10;
                                                                                                   QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------
 Data Node Scan  (cost=0.00..0.00 rows=0 width=0)
   Node/s: dn_6002

 Remote SQL: SELECT test_range_pt.a, test_range_pt.b, test_range_pt.c FROM public.test_range_pt UNION ALL SELECT test_range_pt.a, test_range_pt.b, test_range_pt.c FROM public.test_range_pt ORDER BY
2 LIMIT 10
 Datanode Name: dn_6002
   Limit  (cost=0.01..0.49 rows=10 width=12)
     ->  Result  (cost=0.01..964.51 rows=10 width=12)
           ->  Merge Append  (cost=0.01..964.51 rows=10 width=12)
                 Sort Key: public.test_range_pt.b
                 ->  Index Scan using idx_range_b on test_range_pt  (cost=0.00..357.25 rows=10000 width=12)
                 ->  Index Scan using idx_range_b on test_range_pt  (cost=0.00..357.25 rows=10000 width=12)

(12 rows)

--删除。
gaussdb=# DROP TABLE test_range_pt;

上述示例中,Merge Append算子输出信息如下所示。

信息名称

含义

Merge Append

算子的名称。

Sort Key

Sort算子排序的依据关键字。示例中为grade