点滴学习第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优化中踩过哪些坑?评论区聊聊!

