更新时间: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 |
父主题: 运算符