点滴学习第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优化中踩过哪些坑?评论区聊聊!
五、推荐学习资源
文章转载自数据库运维之道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




