更新时间:2026-07-28 GMT+08:00
分享

Partition Iterator算子消除

场景描述

在当前分区表架构中,执行器通过Partition Iterator算子去迭代访问每一个分区。当分区剪枝结果只有一个分区时,Partition Iterator算子就失去了迭代器的作用,在此情况下消除Partition Iterator算子,可以避免执行时产生一些不必要的开销。由于执行器的PIPELINE架构,Partition Iterator算子会重复执行,在数据量较大的场景下消除Partition Iterator算子的收益十分可观。

示例

非透明多写特性下,消除Partition Iterator算子在GUC参数partition_iterator_elimination开启后才能生效,示例如下:

gaussdb=# CREATE TABLE t1 (c1 INT, c2 INT) PARTITION BY HASH(c1) PARTITIONS 2 SUBPARTITION BY HASH (c2) SUBPARTITIONS 2;
gaussdb=# INSERT INTO t1 SELECT generate_series(1,10),generate_series(1,10);
gaussdb=# SET max_datanode_for_plan = 1;

gaussdb=# EXPLAIN SELECT * FROM t1 WHERE c1 = 7 AND c2 = 7;
                            QUERY PLAN
------------------------------------------------------------------
 Data Node Scan  (cost=0.00..0.00 rows=0 width=0)
   Node/s: datanode3

 Remote SQL: SELECT c1, c2 FROM public.t1 WHERE c1 = 7 AND c2 = 7
 Datanode Name: datanode3
   Partitioned Seq Scan on t1  (cost=0.00..42.23 rows=1 width=8)
     Filter: ((c1 = 7) AND (c2 = 7))
     Selected Partitions:  1
     Selected Subpartitions:  1:1

(10 rows)

gaussdb=# SET partition_iterator_elimination = off;
SET
gaussdb=# EXPLAIN SELECT * FROM t1 WHERE c1 = 7 AND c2 = 7;
                              QUERY PLAN
-----------------------------------------------------------------------
 Data Node Scan  (cost=0.00..0.00 rows=0 width=0)
   Node/s: datanode3

 Remote SQL: SELECT c1, c2 FROM public.t1 WHERE c1 = 7 AND c2 = 7
 Datanode Name: datanode3
   Partition Iterator  (cost=0.00..42.23 rows=1 width=8)
     Iterations: 1, Sub Iterations: 1
     ->  Partitioned Seq Scan on t1  (cost=0.00..42.23 rows=1 width=8)
           Filter: ((c1 = 7) AND (c2 = 7))
           Selected Partitions:  1
           Selected Subpartitions:  1:1

(12 rows)

gaussdb=# DROP TABLE t1;

注意事项及约束条件

  • 只有当GUC参数partition_iterator_elimination开启,且优化器剪枝结果只有一个分区时,目标场景优化才能生效。
  • 支持cplan,支持部分gplan场景,如分区键a = $1的场景(即优化器阶段可以剪枝到一个分区的场景)。
  • 支持SeqScan、Indexscan、Indexonlyscan、Bitmapscan、RowToVec、Tidscan算子。
  • 非透明多写特性下,支持行存,astore/ustore存储引擎,支持SQLBypass。

相关文档