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

【手写数据库内核miniToadb】第115节 DELETE命令逻辑执行计划

开源无限 2025-07-28
73


💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!
🚀 从存储引擎、查询优化到分布式事务,手把手拆解核心模块;从语法解析树构建到执行计划生成,逐行代码还原设计精髓
🌟 无论你是数据库开发者、系统架构师,还是对底层技术充满好奇的极客,这里都有你想要的“硬核干货”!点击关注,与行业老兵共同探索数据库技术的星辰大海!
公众号:开源无限

一、概述 


DELETE命令经过语法解析之后,将命令携带的信息记录在结构体当前,如何按命令的语义执行呢?这就需要将命令信息转换成执行计划,分为两个阶段:一是逻辑执行计划,将它转换为关系代数的形式,方便进行逻辑层面的优化;二是物理执行计划,关联到真正执行的算子,并且将各个算子串联成执行路径。

二、逻辑执行计划 


前一节DELETE命令语法规则中,它的from子句中只有一个目标表,更多的筛选条件在where子句中,当然可以使用子查询来实现更复杂的多表关联。在逻辑执行计划阶段,按照关系运算操作要素来划分,主要对基本数据表和选择操作的要素进行整理。


2.1 基本数据表  

基本数据表其实只有一个,加入链表当中,复用SELECT命令的处理逻辑。

    int LogicalDeletePlan(QueryStmt *queryStmt)


        /* base relations */
        retCode = TableNodeProcess(queryStmt, delStmt->targetRel);
        if(retCode < 0)
            return retCode;


    2.2 条件表达式  

    选择操作对应where子句的各种条件表达式,其中含有嵌套子查询,这里只是留了一个扩展接口,并没有实现子查询的处理,条件表达式的处理也是复用SELECT命令的where子句的处理逻辑。

        retCode = WhereClauseRelationProcess(queryStmt, delStmt->whereList);
          if(retCode <0)
              return retCode;


          /* expre */
          retCode = WhereExprProcess(queryStmt, delStmt->whereList);
          if(retCode < 0)
              return retCode;

       三、总结 


      在DELETE命令的逻辑执行计划当中,命令传递的信息不同,处理逻辑仍然是SELECT命令子句处理,这也使得各命令之间相同子句的处理逻辑复用,简化了编码的过程,同时处理逻辑在各命令中得到充分的验证。

      经过逻辑计划阶段的整理之后,选择操作被归纳成为表达式的二叉树,它的根节点是一个逻辑表达式。

      本节实现在exam_71 目录下的plan.c文件中。


      🌟 点赞收藏,分享给身边的技术伙伴,关注我们,持续获取数据库内核开发的硬核干货!一起从源码级实现到分布式架构,解锁数据库技术的每一个核心细节!🚀

      【往期精彩推荐】

      【手写数据库核心揭秘系列】第112节 终于到DELETE命令啦~

      【手写数据库核心揭秘系列】第110节 谁在浪费存储空间? 再添新机制,随时回收无效空间

      【手写数据库核心揭秘系列】第108节 数据行的更新操作流程,修改的内容放不下怎么办?


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

      评论