写点什么

openGauss 内核分析(七):SQL by pass & 经典执行器 (二)

作者:daydayup
  • 2023-07-27
    北京
  • 本文字数:1004 字

    阅读完需:约 3 分钟

openGauss 内核分析(七):SQL by pass & 经典执行器 (二)

02 经典的执行器


关闭 enable_opfusion,简单 insert 的执行计划是这样的: ![图片](data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)


在这种执行流程中 Portal 是执行 SQL 语句的载体,每一条 SQL 对应唯一的 Portal,不同的查询类型对应的 Portal 类型也有区别。


typedef enum PortalStrategy {    PORTAL_ONE_SELECT, // SQL语句包含单一的SELECT查询    PORTAL_ONE_RETURNING, // INSERT/UPDATE/DELETE语句包含Returning    PORTAL_ONE_MOD_WITH, // 查询语句包含With    PORTAL_UTIL_SELECT, // 工具类型查询语句,如explain    PORTAL_MULTI_QUERY // 所有其他类型查询语句} PortalStrategy;
复制代码


Portal 的生命周期管理在 exec_simple_query 函数中实现,该函数负责 Portal 创建、执行和清理。Portal 执行的主要执行流程包括 PortalStart 函数、PortalRun 函数、PortalDrop 函数几个部分。其中 PortalStart 函数负责进行 Portal 结构体初始化工作,包括执行算子初始化、内存上下文分配等;PortalRun 函数负责真正的执行和运算,它是执行器的核心;PortalDrop 函数负责最后的清理工作,主要是数据结构、缓存的清理。



bool PortalRun(    Portal portal, long count, bool isTopLevel, DestReceiver* dest, DestReceiver* altdest, char* completionTag){            switch (portal->strategy) {            case PORTAL_ONE_SELECT:            case PORTAL_MULTI_QUERY: // insert从这里进入                PortalRunMulti(portal, isTopLevel, dest, altdest, completionTag);                 /* Prevent portal's commands from being re-executed */                MarkPortalDone(portal);                /* Always complete at end of RunMulti */                result = true;                break;}
复制代码


用户头像

daydayup

关注

还未添加个人签名 2023-07-18 加入

还未添加个人简介

评论

发布
暂无评论
openGauss内核分析(七):SQL by pass & 经典执行器 (二)_daydayup_InfoQ写作社区