
# 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。
 
