💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!
一、概述
这里来实现迭代类型的执行器模型,它的执行流程如下:
向下调用;从执行计划的根节点开始,逐层向下调用各操作符的执行函数,通过叶子扫描操作符节点获得一条行记录; 再向上回归运算,各运算符节点根据从下层获得的结果进行运算,直到回到根节点; 再重复以上两个步骤,直到叶子节点没有行记录,结束执行。
二、迭代执行
以下是查询命令执行器的顶层驱动过程,通过一个大循环来迭代执行,直到结果集为空时结束执行。
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目录下。
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




