更新时间: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。
父主题: 分区算子执行优化