openGauss内核分析(七):SQL by pass & 经典执行器 (二)
  lYE0sTgD5uUi 2023年11月02日 92 0

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

02 经典的执行器

关闭enable_opfusion,简单insert的执行计划是这样的:

在这种执行流程中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函数负责最后的清理工作,主要是数据结构、缓存的清理。

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

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;
    …
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  X5zJxoD00Cah   2023年11月24日   38   0   0 SQL运算符
  X5zJxoD00Cah   2023年11月22日   40   0   0 逆序SQL
  X5zJxoD00Cah   2023年12月11日   30   0   0 表名SQL
  DF5J4hb0hcmT   2023年12月08日   30   0   0 慢查询druidSQL
lYE0sTgD5uUi