OpenGuass 之 where 1 = 0 处理流程代码走读

本文详细描述了OpenGauss在处理where1=0这类固定为否的查询时,如何通过常量表达式计算、生成执行计划(BaseResultvsSeqScan)、以及执行BaseResult计划的流程,强调了这些技术对查询性能的影响。
摘要由CSDN通过智能技术生成
一. 前言

       在OpenGuass中,如果where 条件中包含where 1= 0 等固定为否条件的查询语句,在生成执行计划的时候,执行计划是BaseResult类型,此类型的执行计划不会进行物理数据扫描,如下所示:

      对于非固定为否条件(如where id = 1)的语句,对应的执行计划则是SeqScan,此类计划会先执行物理扫描数据,扫描数据后在根据谓词条件进行优化,如下所示:

        本文主要是通过代码走读来了解在OpenGuass中对于where 1 = 0的固定为伪条件的处理流程。

二.  计算1= 0的结果为常量 false

​       OpenGuass在生成执行计划的时候,会先进行常量表达式的计算和替换,对于 1=0的计算表达式,计算完成之后直接用常量false代替,对应的实现代码如下所示:

preprocess_const_params
  preprocess_const_params_worker
    eval_const_expressions
      eval_const_expressions_mutator
        simple = simplify_function   // 计算1=0表达式的结果为false,用false常量替换成1=0
三.  生成执行计划中对于where false的处理

      在生成计划的时候,如果发现计划中有where false固定为伪的条件,OpenGuass会执行生成BaseResult的执行计划而不是Scan的执行计划,此步骤是在create_gating_plan函数中实现的,主要的代码执行流程如下所示:

create_scan_plan
  if (root->hasPseudoConstantQuals) { // hasPseudoConstantQuals的意思是有where条件,且where条件的结果为常量false
      create_gating_plan
         pseudoconstants = extract_actual_clauses(quals, true);  // extract_actual_clauses结果将返回谓词条件中是否有常量false
         if (pseudoconstants == NIL) {
             return plan;  // 没有常见false的话,继续返回原来的Scan计划
          }
          make_result
             BaseResult* node = makeNode(BaseResult);  // 直接返回BaseResult计划
             
四. 执行BaseResult计划

       在执行BaseResult的执行计划中,如果发现有谓词条件,且谓词条件的计算结果固定为false,则执行返回NULL,则空结果,此功能入口是在ExecResult中,主要执行流程如下所示:

ExecResult
   bool qualResult = ExecQual((List*)node->resconstantqual, econtext, false);  // 计算where的结果
   if (!qualResult) {
       return NULL;   // 如果固定为fasle,则返回空结果
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值