postgresql源码(十二)——Executor(Materialization节点(下))

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

7.SetOp节点

SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT、INTERSECT两种集合操作,至于另一种集合操作UNION,可直接由Append节点来实现。

一个SetOp节点只能处理一个集合操作(由两个集合参与),如果有多个集合操作则需要组合多个SetOp节点来实现。SetOp节点仅有一个左子节点作为输人,其左子节点是一个Append节点或者是一个Sort节点(Sort节点的子节点是一个Append节点),其低层的Append节点中只放置两个子计划用于表示参与集合操作的左集合和右集合。由于进行集合操作时需要区分元组来自哪一个子査询,因此在低层Append节点的投影操作时会为每个子计划输出元组增加一个子计划标记属性(见下面的例子)。

 
  1. postgres=# explain (select id from test_dm) except (select id from test_dm2);

  2. QUERY PLAN

  3. -----------------------------------------------------------------------------------------

  4. HashSetOp Except (cost=0.00..383303.38 rows=1000000 width=4)

  5. -> Append (cost=0.00..355803.34 rows=11000017 width=4)

  6. -> Subquery Scan on "*SELECT* 1" (cost=0.00..32346.00 rows=1000000 width=4)

  7. -> Seq Scan on test_dm (cost=0.00..22346.00 rows=1000000 width=4)

  8. -> Subquery Scan on "*SELECT* 2" (cost=0.00..323457.34 rows=10000017 width=4)

  9. -> Seq Scan on test_dm2 (cost=0.00..223457.17 rows=10000017 width=4)

  10. (6 行)

SetOp有两种执行策略:排序(SETOP_SORTED)和Hash (SETOP_HASHED)。

  • 排序策略下首先利用Sort节点对Append节点返回的元组集合进行排序,然后进行交、差的集合操作;

  • Hash策略下则通过SetOp节点提供Hash表对子査询元组进行Hash分组,然后进行集合操作。

在Hash策略下,SetOp节点的左子节点就是Append节点。在SetOp执行过程中需要附加子计划标记属性,这个属性在输人元组中的偏移位置被记录在SetOp节点的flagColIdx字段中。SetOp节点的定义如下:

 
  1. typedef struct SetOp

  2. {

  3. Plan plan;

  4. SetOpCmd cmd; /* what to do */

  5. SetOpStrategy strategy; /* how to do it */

  6. int numCols; /* number of columns to check for

  7. * duplicate-ness */

  8. AttrNumber *dupColIdx; /* their indexes in the target list */

  9. Oid *dupOperators; /* equality operators to compare with */

  10. AttrNumber flagColIdx; /* where is the flag column, if any */

  11. int firstFlag; /* flag value for first input relation */

  12. long numGroups; /* estimated number of groups in input */

  13. } SetOp;

其中除了标志属性的位置外,还有用于去重

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值