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

解剖达梦数据库的SQL语句:从文本到结果的奇妙旅程

279

点滴学习第1篇:CentOS Stream 9环境下部署达梦8数据库

点滴学习第2篇:达梦数据库不更改SQL语句而改变其执行计划

点滴学习第3篇:数据库性能统计信息是DBA的火眼金睛


前 言

当你在达梦数据库中敲下一条SELECT
语句时,它经历了怎样的奇幻漂流?从字符文本变成精准结果,背后是达梦数据库精心设计的SQL编译器SQL执行引擎的协作。本文用"庖丁解牛"的方式,带你一起学习达梦数据库的SQL语句的执行过程(解析、执行和获取)!


一、SQL编译器三剑客

1. 解析器:SQL的"翻译官"

  • 任务:将SQL文本转换为“语法树”(AST),就像把句子拆成主谓宾。
  • 词法分析:将SQL语句拆分为一个个的“词法单元”(Token),如关键字、标识符、运算符等。
  • 示例
    SELECT name, age FROM users WHERE age > 18;
    会被拆分为:SELECT
    name
    ,
    age
    FROM
    users
    WHERE
    age
    >
    18
    • 语法分析功能:根据SQL语法规则,将词法单元组织成语法树(Parse Tree),检查语句是否符合语法规范。
    • 示例
      SELECT name, age FROM users WHERE age > 18;
      会被解析为:
        SelectStmt
          -> TargetList: name, age
          -> FromClause: users     
          -> WhereClause: age > 18
        • 语义分析:检查语法树的语义是否正确,例如表是否存在、列是否合法、数据类型是否匹配等。
          • 检查users
            表是否存在。
          • 检查name
            age
            列是否存在。
          • 检查age
            列的数据类型是否支持比较操作。

        2. 查询优化器:数据库的"最强大脑"

        • 核心问题:一条SQL可能有一组可能被使用的执行计划,如何选择最优解?
        • 达梦的绝招:基于代价模型(Cost-Based Optimizer),代价衡量指标包括选择率、基数、代价,比较执行计划的代价,选择最小一个代价的计划。

        3. 行源生成器:执行计划的"组装工人"

        • 职责:将优化后的执行计划生成行源,即可被迭代控制的结构体。
        • 输出:生成可执行的“行源”(Row Source),为SQL执行引擎提供操作。

        二、执行引擎:数据流转的"高速流水线"

        1. 火山模型:逐行处理的经典设计

        • 工作原理:像流水线一样逐行处理数据,每个操作符(如Filter
          Join
          )通过next()
          方法传递数据。
        • 达梦优化:引入向量化处理(批量处理数据块),减少函数调用开销,提升吞吐量。

        2. 关键黑科技

        • 并行执行:将任务拆分成子任务,多线程/多节点并行处理(例如PARALLEL
          提示)。
        • 结果缓存:对高频重复查询缓存结果,减少重复计算(适用OLAP场景)。
        • 内存管理:通过智能内存池(Memory Pool)避免频繁内存分配,降低碎片化。

        三、SQL执行全过程

        一条SQL语句
        的具体执行过程包括以下步骤:

        1. 客户端把语句发送给服务器端执行

        2. 语句解析

        • 查询库缓存:在数据库的高速缓存中去查找是否存在相同语句的执行计划
        • 语句合法性检查:查看其是否合乎语法法则
        • 语言含义检查:对语句中的字段、表等内容进行检查
        • 获得对象解析锁:对需要查询的对象加锁
        • 数据访问权限的核对:用户是否有数据访问权限
        • 确定最佳执行计划:确定最佳执行计划,保存到库缓存(Library Cache)。

        3. 语句执行

        服务器进程执行SQL语句,若被选择行所在的数据块已被读取到数据缓冲区
        ,则服务器进程直接把这个数据反馈给客户端。若数据不在缓冲区中,服务器进程从数据文件中查询相关数据,放到数据缓冲区(Buffer Cache)

        4. 提取数据

        服务器进程把查询到的数据结果返回给客户端进程,完成整个查询。


        四、查询优化器

        达梦数据库优化器所做的操作有查询转换、估算代价、生成计划。

        • 查询转换把查询块之间的连接类型、嵌套关系进行调整,生成更好的执行计划,例如:过滤条件下放、相关子查询去相关性;
        • 估算代价选择率是满足条件的记录数占总记录数的百分比;基数是整个行集的行数;磁盘I/O、CPU占用和内存使用情况作为代价计算的依据;
        • 生成计划对给定的查询按照连接方式、连接顺序、访问路径生成不同的执行计划。
          无论是开发者的SQL调优,还是DBA的架构设计,理解这些原理都能让你事半功倍

        🔗 互动话题:你在SQL优化中踩过哪些坑?评论区聊聊!


        五、推荐学习资源

        1、达梦数据库查询性能调优实践
        2、查询优化
        https://eco.dameng.com/document/dm/zh-cn/pm/query-optimization.html

        近期热门文章:
        👉Oracle RAC集群OCR注册信息恢复案例分享
        👉学习笔记-DM8达梦数据库启动过程
        👉达梦数据库DM8小版本升级案例分享
        👉如何利用RMAN Debug命令来诊断问题
        👉达梦数据守护集群异常脑裂处理案例总结
        👉Linux运维技能-du命令常见用例总结
        👉Oracle 10g 备份恢复及容灾部署技术问题总结
        👉TiDB 7.5 实验测试环境搭建及小插曲处理
        👉DBA实验手册第3讲 运用bbed工具恢复delete误删除的数据
        👉DBA实验手册第5讲 运用bbed工具恢复truncate表及反向构造段头块
        全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

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

        评论