暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库核心揭秘系列】第79讲 迭代执行器的实现

开源无限 2025-04-09
74

💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!

🚀 从存储引擎、查询优化到分布式事务,手把手拆解核心模块;从语法解析树构建到执行计划生成,逐行代码还原设计精髓
🌟 无论你是数据库开发者、系统架构师,还是对底层技术充满好奇的极客,这里都有你想要的“硬核干货”!点击关注,与行业老兵共同探索数据库技术的星辰大海!

一、概述 


这里来实现迭代类型的执行器模型,它的执行流程如下:

  1. 向下调用;从执行计划的根节点开始,逐层向下调用各操作符的执行函数,通过叶子扫描操作符节点获得一条行记录;
  2. 再向上回归运算,各运算符节点根据从下层获得的结果进行运算,直到回到根节点;
  3. 再重复以上两个步骤,直到叶子节点没有行记录,结束执行。

二、迭代执行 


以下是查询命令执行器的顶层驱动过程,通过一个大循环来迭代执行,直到结果集为空时结束执行。

int ExecSelectStmt(Node *rootNode)
{
    int ret = 0, rowNum = 0;
    int showHead = 1;
    Node *resultList = NULL;
    QueryStmt *queryPlan = (QueryStmt*)rootNode;

    do {
        resultList = ExecNodeProc(queryPlan->plan);
        if(resultList == NULL)
            break;
        
        PortalShowResult(resultList, queryPlan->topTargetList, showHead);
        if(showHead)
            showHead = 0;

        rowNum += 1
    }while(resultList != NULL);

    return rowNum;
}

每当调用执行函数获取一条结果集,就输出到客户端进行显示;在执行函数中会按执行计划进行调用。

三、执行函数调用 


每个操作符节点都有一组统一的处理函数,这样就可以标准化的调用执行,当传入当前操作节点时,就可以调用它的主处理函数,并返回它的处理结果。

Node* ExecNodeProc(Node *planNode)
{
    Node* rowData = NULL;

    PlanNode *node = (PlanNode*)planNode;

    if((NULL != node) && (NULL != node->execInfo->execNodeProc))
    {        
        rowData = node->execInfo->execNodeProc(planNode);
    }

    return rowData;
}

四、总结 


本节新增接口定义在excutor.c文件中,位置exam_46目录下。


🌟 点赞收藏,分享给身边的技术伙伴,关注我们,持续获取数据库内核开发的硬核干货!一起从源码级实现到分布式架构,解锁数据库技术的每一个核心细节!🚀
【往期精彩推荐】
【手写数据库核心揭秘系列】第78讲 执行器的介绍 迭代式火山模型
【手写数据库核心揭秘系列】第77讲 联接数据表生成Join扫描节点
【手写数据库核心揭秘系列】第76讲 普通表生成扫描节点,无条件下多表查询为何可能引发性能灾难?


文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论