一. 前言
谓词下推是每一个SQL引擎必备的功能。本文主要通过走读代码了解openGauss中是如何实现谓词下推能力的。
谓词下推即是将过滤条件尽可能往tablescan的数据源节点下推,以实现上层算子尽可能少计算的能力,如下所示的执行计划便已经将谓词id<55下推到了tablescan节点。
二. 执行计划生成时将谓词信息保存在ScanState.ps.qual中
实现谓词下推首先需要在执行计划生成节点时将谓词过滤条件信息保存到tablescan节点,openGuass主要靠如下的步骤实现过滤条件保存到SeqScan的:
1. openGuass首先会在将Join中涉及的物理表提取出来,然后处理where条件中,将where条件谓词的信息保存到对应relation的baserestrictinfo字段中,此步的操作入口在deconstruct_jointree函数中,代码流程如下所示:
deconstruct_jointree
deconstruct_recurse
if (IsA(jtnode, FromExpr))
{
foreach (l, f->fromlist) { // 找出from后边的物理表
sub_joinlist = deconstruct_recurse(...&child_postponed_quals); // 抽取from实体表的eqal条件,保存在child_postponed_quals中
foreach (l,