大数跨境
0
0

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

解剖达梦数据库的SQL语句:从文本到结果的奇妙旅程 数据库运维之道
2025-02-04
2
导读:当你在达梦数据库中敲下一条SELECT语句时,它经历了怎样的奇幻漂流?从字符文本变成精准结果,背后是达梦数据库精心设计的SQL编译器与SQL执行引擎的协作。

点滴学习第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;
会被拆分为:SELECTname,ageFROMusersWHEREage>18
  • 语法分析功能:根据SQL语法规则,将词法单元组织成语法树(Parse Tree),检查语句是否符合语法规范。
  • 示例
SELECT name, age FROM users WHERE age > 18;
会被解析为:
SelectStmt  -> TargetList: name, age  -> FromClause: users       -> WhereClause: age > 18
  • 语义分析:检查语法树的语义是否正确,例如表是否存在、列是否合法、数据类型是否匹配等。
    • 检查users表是否存在。
    • 检查nameage列是否存在。
    • 检查age列的数据类型是否支持比较操作。

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

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

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

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

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

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

  • 工作原理:像流水线一样逐行处理数据,每个操作符(如FilterJoin)通过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表及反向构造段头块
全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

【声明】内容源于网络
0
0
数据库运维之道
数据库领域原创技术号,专注于Oracle、MySQL、TDSQL、HotDB、TiDB、达梦等数据库研究,深入数据库技术原理,分布式数据库,开源数据库,国产数据库,前沿数据库技术。
内容 50
粉丝 0
数据库运维之道 数据库领域原创技术号,专注于Oracle、MySQL、TDSQL、HotDB、TiDB、达梦等数据库研究,深入数据库技术原理,分布式数据库,开源数据库,国产数据库,前沿数据库技术。
总阅读17
粉丝0
内容50