7.SetOp节点
SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT、INTERSECT两种集合操作,至于另一种集合操作UNION,可直接由Append节点来实现。
一个SetOp节点只能处理一个集合操作(由两个集合参与),如果有多个集合操作则需要组合多个SetOp节点来实现。SetOp节点仅有一个左子节点作为输人,其左子节点是一个Append节点或者是一个Sort节点(Sort节点的子节点是一个Append节点),其低层的Append节点中只放置两个子计划用于表示参与集合操作的左集合和右集合。由于进行集合操作时需要区分元组来自哪一个子査询,因此在低层Append节点的投影操作时会为每个子计划输出元组增加一个子计划标记属性(见下面的例子)。
-
postgres=# explain (select id from test_dm) except (select id from test_dm2); -
QUERY PLAN -
----------------------------------------------------------------------------------------- -
HashSetOp Except (cost=0.00..383303.38 rows=1000000 width=4) -
-> Append (cost=0.00..355803.34 rows=11000017 width=4) -
-> Subquery Scan on "*SELECT* 1" (cost=0.00..32346.00 rows=1000000 width=4) -
-> Seq Scan on test_dm (cost=0.00..22346.00 rows=1000000 width=4) -
-> Subquery Scan on "*SELECT* 2" (cost=0.00..323457.34 rows=10000017 width=4) -
-> Seq Scan on test_dm2 (cost=0.00..223457.17 rows=10000017 width=4) -
(6 行)
SetOp有两种执行策略:排序(SETOP_SORTED)和Hash (SETOP_HASHED)。
-
排序策略下首先利用Sort节点对Append节点返回的元组集合进行排序,然后进行交、差的集合操作;
-
Hash策略下则通过SetOp节点提供Hash表对子査询元组进行Hash分组,然后进行集合操作。
在Hash策略下,SetOp节点的左子节点就是Append节点。在SetOp执行过程中需要附加子计划标记属性,这个属性在输人元组中的偏移位置被记录在SetOp节点的flagColIdx字段中。SetOp节点的定义如下:
-
typedef struct SetOp -
{ -
Plan plan; -
SetOpCmd cmd; /* what to do */ -
SetOpStrategy strategy; /* how to do it */ -
int numCols; /* number of columns to check for -
* duplicate-ness */ -
AttrNumber *dupColIdx; /* their indexes in the target list */ -
Oid *dupOperators; /* equality operators to compare with */ -
AttrNumber flagColIdx; /* where is the flag column, if any */ -
int firstFlag; /* flag value for first input relation */ -
long numGroups; /* estimated number of groups in input */ -
} SetOp;
其中除了标志属性的位置外,还有用于去重

本文介绍了PostgreSQL中的SetOp节点,用于处理EXCEPT和INTERSECT操作,以及WindowAgg节点处理窗口函数。SetOp节点执行策略包括排序和哈希。同时详细讲解了Limit节点的使用和LockRows节点在行级锁定中的作用。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



