# 51.6.遗嘱执行人

这个遗嘱执行人获取由planner/optimizer创建的计划,并对其进行递归处理,以提取所需的行集。这本质上是一种需求拉动管道机制。每次调用计划节点时,它必须再传递一行,或者报告它已完成传递行。

为了提供一个具体的例子,假设顶部节点是合并加入节点。在进行任何合并之前,必须提取两行(每个子平面一行)。因此,执行器递归地调用自己来处理子计划(它从连接到的子计划开始)左树).新的顶部节点(左子平面的顶部节点)是一个分类需要节点和递归来获取输入行。的子节点分类可能是一个SeqScan节点,表示表的实际读取。执行此节点会导致执行器从表中获取一行,并将其返回给调用节点。这个分类节点将重复调用其子节点以获取所有要排序的行。当输入耗尽时(如子节点返回NULL而不是行所示)分类代码执行排序,最后能够返回其第一个输出行,即按排序顺序返回的第一个输出行。它将剩余的行存储起来,以便能够按照排序顺序交付它们,以响应以后的需求。

这个合并加入节点同样要求从其右侧子平面中获取第一行。然后比较两行,看看它们是否可以连接;如果是这样,它将向调用者返回一个连接行。在下一次调用时,或者如果无法连接当前的一对输入,则会立即前进到一个表或另一个表的下一行(取决于比较结果),并再次检查是否匹配。最终,一个子计划或另一个子计划耗尽,而合并加入节点返回NULL以指示不能再形成联接行。

复杂的查询可能涉及许多级别的计划节点,但一般的方法是相同的:每次调用每个节点时,每个节点都会计算并返回其下一个输出行。每个节点还负责应用规划器分配给它的任何选择或投影表达式。

executor机制用于评估所有四种基本SQL查询类型:选择, 插入, 使现代化删去对于选择,顶层执行器代码只需要将查询计划树返回的每一行发送到客户端。插入选择, 使现代化删去有效地选择在一个名为可修改.

插入选择将行数增加到可修改用于插入。对于使现代化,计划者安排每个计算行包括所有更新的列值,以及工贸署原始目标行的(元组ID或行ID);这些数据受够了可修改节点,它使用该信息创建一个新的更新行,并将旧行标记为已删除。对于删去,计划实际返回的唯一列是TID,而可修改节点只需使用TID访问每个目标行并将其标记为已删除。

简单的插入价值观命令创建一个由单个后果节点,它只计算一个结果行,并将其提供给可修改执行插入。