MergeAppend

名称

合并追加算子

介绍

MergeAppend算子利用了Mergejoin算法思想,如果子计划有序并且有序列与目标列相同, 则可以省略子计划的排序;否则对子计划结果分别进行排序。然后分别依次从子计划中取出队列中的第一行,按照union、intersect(all)和except(all)的语义进行运算。

默认情况下MergeAppend算子不可用,设置为可用时,会给优化器会给优化器提供一个生成MergeAppend路径选择,根据执行代价计算最优执行计划。在实现UNION操作时,相比于 Append 算子,MergeAppend算子会先对子计划的结果执行 Sort ,然后再合并,MergeAppend算子本身具有去重操作,因此上层不需要生成 Unique 算子。

举例

--清理环境
SET ENABLE_MERGEAPPEND = TRUE;
DROP TABLE t1 CASCADE;

--创建环境
CREATE TABLE t1(a int primary key, b int);
INSERT INTO t1 VALUES(1,12);
INSERT INTO t1 VALUES(2,13);
INSERT INTO t1 VALUES(3,14);
INSERT INTO t1 VALUES(4,14);
ANALYZE t1;

EXPLAIN ANALYZE SELECT * FROM t1 WHERE a<2 UNION SELECT * FROM t1 WHERE b=14;
                                                                   QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
 MergeAppend  (cost=11.21..11.24 rows=0 width=8) (actual time=0.07..0.07 rows=3 loops=1)
   ->  Subquery Scan "*SELECT* 1"  (cost=4.15..4.16 rows=1 width=8) (actual time=0.04..0.04 rows=1 loops=1)
         ->  Sort  (cost=4.15..4.16 rows=1 width=8) (actual time=0.03..0.03 rows=1 loops=1)
               Sort Key: A, B
               ->  Index Scan using T1_PKEY(Normal Index Scan) on T1  (cost=0.01..4.14 rows=1 width=8) (actual time=0.02..0.02 rows=1 loops=1)
                     Index Key: (A < 2)
   ->  Subquery Scan "*SELECT* 2"  (cost=7.06..7.06 rows=2 width=8) (actual time=0.03..0.03 rows=2 loops=1)
         ->  Sort  (cost=7.06..7.06 rows=2 width=8) (actual time=0.03..0.03 rows=2 loops=1)
               Sort Key: A, B
               ->  Seq Scan on T1  (cost=0.00..7.05 rows=2 width=8) (actual time=0.01..0.02 rows=2 loops=1)
                     Scan Key: (B = 14)
 Planning Time: 0.64 msec
 Execution Time: 0.35 msec
(13 rows)