|
| 1 | +如图[image](images/miniob-sql-execution-process.png) |
| 2 | + |
| 3 | +PlantUML时序图使用 https://www.plantuml.com/plantuml 生成 |
| 4 | +代码如下: |
| 5 | +```cpp |
| 6 | +@startuml |
| 7 | +title SQL 执行流程时序图\n |
| 8 | + |
| 9 | +skinparam sequence { |
| 10 | + ArrowColor #003366 |
| 11 | + LifeLineBorderColor #003366 |
| 12 | + LifeLineBackgroundColor #F0F8FF |
| 13 | + ParticipantBorderColor #003366 |
| 14 | + ParticipantBackgroundColor #E6F7FF |
| 15 | + ParticipantFontColor #003366 |
| 16 | + NoteBackgroundColor #FFF2E6 |
| 17 | + NoteBorderColor #FFA940 |
| 18 | + BoxPadding 20 |
| 19 | +} |
| 20 | + |
| 21 | +actor 客户端 as Client |
| 22 | +participant "Server" as Server |
| 23 | +participant "TaskHandler" as TaskHandler |
| 24 | +participant "SessionStage" as Session |
| 25 | +participant "ParseStage" as Parser |
| 26 | +participant "ResolveStage" as Resolver |
| 27 | +participant "OptimizeStage" as Optimizer |
| 28 | +participant "ExecuteStage" as Executor |
| 29 | +participant "ResultHandler" as Result |
| 30 | + |
| 31 | +autonumber "<b>[000]" |
| 32 | + |
| 33 | +Client -> Server: SQL命令(网络请求) |
| 34 | +note right: 1. 客户端发送SQL到服务器端口\n - 建立TCP连接\n - 传输SQL文本 |
| 35 | +activate Server |
| 36 | + |
| 37 | +Server -> TaskHandler: handle_event(communicator) |
| 38 | +activate TaskHandler |
| 39 | +note right: 2. 任务处理器初始化\n - 创建事件对象\n - 绑定通信器\n - 准备处理环境 |
| 40 | + |
| 41 | +TaskHandler -> Session: handle_request2(event) |
| 42 | +activate Session |
| 43 | +Session --> TaskHandler: 会话就绪 |
| 44 | +deactivate Session |
| 45 | +note right Session: 3. 会话管理\n - 用户身份验证\n - 设置数据库上下文\n - 维护会话状态 |
| 46 | + |
| 47 | +group "SQL处理核心 (责任链模式)" |
| 48 | + TaskHandler -> Parser: handle_request(sql_event) |
| 49 | + activate Parser |
| 50 | + group "ParseStage.handle_request" |
| 51 | + Parser -> Parser: parse(sql.c_str()) |
| 52 | + note right: 4.1 启动SQL解析\n - 准备解析环境 |
| 53 | + Parser -> Parser: yylex_init_extra() |
| 54 | + note right: 4.2 初始化词法扫描器\n - 分配扫描器资源\n - 设置字符串缓冲区 |
| 55 | + Parser -> Parser: yyparse(scanner) |
| 56 | + note right: 4.3 语法解析核心\n - Flex词法分析\n - Bison语法分析\n - 生成AST节点树 |
| 57 | + Parser -> Parser: yylex_destroy() |
| 58 | + note right: 4.4 释放扫描器资源\n - 清理词法分析状态 |
| 59 | + Parser --> TaskHandler: 返回AST |
| 60 | + end |
| 61 | + deactivate Parser |
| 62 | + note right: 5. 解析完成\n - 输出抽象语法树(AST)\n - 支持SELECT/INSERT等语句结构 |
| 63 | + |
| 64 | + TaskHandler -> Resolver: handle_request(sql_event) |
| 65 | + activate Resolver |
| 66 | + group "ResolveStage.handle_request" |
| 67 | + Resolver -> Resolver: Stmt::create_stmt() |
| 68 | + note right: 6.1 语句转换入口\n - 根据AST节点类型分发 |
| 69 | + Resolver -> Resolver: 递归处理节点 |
| 70 | + note right: 6.2 深度遍历语法树\n - 处理子表达式\n - 构建完整语句结构 |
| 71 | + Resolver -> Resolver: 创建具体Stmt对象 |
| 72 | + note right: 6.3 生成可执行语句\n - SelectStmt\n - InsertStmt\n - UpdateStmt等 |
| 73 | + Resolver --> TaskHandler: 返回Stmt |
| 74 | + end |
| 75 | + deactivate Resolver |
| 76 | + note right: 7. 转换完成\n - AST→可执行Stmt对象\n - 完成语义分析 |
| 77 | + |
| 78 | + TaskHandler -> Optimizer: handle_request(sql_event) |
| 79 | + activate Optimizer |
| 80 | + group "OptimizeStage.handle_request" |
| 81 | + Optimizer -> Optimizer: create_logical_plan() |
| 82 | + note right: 8.1 创建初始逻辑计划\n - 扫描算子\n - 连接算子\n - 投影算子 |
| 83 | + Optimizer -> Optimizer: logical_plan_generator.create() |
| 84 | + note right: 8.2 生成逻辑算子树\n - 递归处理Stmt对象 |
| 85 | + |
| 86 | + group "重写规则应用" |
| 87 | + Optimizer -> Optimizer: ComparisonSimplificationRule.rewrite() |
| 88 | + note right: 9.1 比较表达式简化\n 例: 1=1 → true\n 常量折叠优化 |
| 89 | + Optimizer -> Optimizer: ConjunctionSimplificationRule.rewrite() |
| 90 | + note right: 9.2 连接表达式简化\n 例: false AND expr → false\n 短路逻辑优化 |
| 91 | + Optimizer -> Optimizer: PredicateRewriteRule.rewrite() |
| 92 | + note right: 9.3 谓词重写\n 删除恒真表达式\n 简化条件结构 |
| 93 | + Optimizer -> Optimizer: PredicatePushdownRewriter.rewrite() |
| 94 | + note right: 9.4 谓词下推\n 将过滤条件下推至扫描层\n 减少中间结果集 |
| 95 | + end |
| 96 | + |
| 97 | + Optimizer -> Optimizer: optimize() |
| 98 | + note right: 10. 基于代价优化\n - 选择最优连接顺序\n - 索引选择\n - 访问路径优化 |
| 99 | + |
| 100 | + Optimizer -> Optimizer: generate_physical_plan() |
| 101 | + alt 向量模型 |
| 102 | + Optimizer -> Optimizer: physical_plan_generator.create_vec() |
| 103 | + note right: 11.1 向量化执行计划\n - 批量处理(1024行/批)\n - 列式内存布局\n - 现代OLAP优化 |
| 104 | + else 火山模型 |
| 105 | + Optimizer -> Optimizer: physical_plan_generator.create() |
| 106 | + note right: 11.2 迭代式执行计划\n - 逐行处理\n - next()接口模型\n - 传统OLTP优化 |
| 107 | + end |
| 108 | + Optimizer --> TaskHandler: 返回执行计划 |
| 109 | + end |
| 110 | + deactivate Optimizer |
| 111 | + note right: 12. 优化完成\n - 生成物理执行计划\n - 准备执行环境 |
| 112 | + |
| 113 | + TaskHandler -> Executor: handle_request(sql_event) |
| 114 | + activate Executor |
| 115 | + group "ExecuteStage.handle_request" |
| 116 | + alt 有物理算子(DML) |
| 117 | + Executor -> Executor: handle_request_with_physical_operator() |
| 118 | + note right: 13.1 DML执行路径\n - SELECT: 执行查询\n - INSERT: 插入数据\n - DELETE: 删除数据 |
| 119 | + Executor --> TaskHandler: DML结果 |
| 120 | + else 无物理算子(DDL) |
| 121 | + Executor -> Executor: command_executor.execute() |
| 122 | + note right: 13.2 DDL执行路径\n - CREATE TABLE\n - CREATE INDEX\n - ALTER TABLE |
| 123 | + Executor --> TaskHandler: DDL结果 |
| 124 | + end |
| 125 | + end |
| 126 | + deactivate Executor |
| 127 | + note right: 14. 执行完成\n - 数据变更生效\n - 查询结果就绪 |
| 128 | +end |
| 129 | + |
| 130 | +TaskHandler -> Result: write_result(event) |
| 131 | +activate Result |
| 132 | + |
| 133 | +group "ResultHandler处理" |
| 134 | + alt 无结果集(DDL/更新) |
| 135 | + Result -> Result: write_result_internal() |
| 136 | + note right: 15.1 简单结果处理\n - 操作状态(成功/失败)\n - 影响行数统计 |
| 137 | + Result --> Client: 状态码 |
| 138 | + else 有结果集(查询) |
| 139 | + Result -> Result: sql_result->open() |
| 140 | + note right: 15.2 初始化结果集\n - 准备数据缓冲区\n - 获取表头信息 |
| 141 | + Result -> Result: 打印表头 |
| 142 | + note right: 15.3 输出列信息\n - 列名\n - 数据类型\n - 列宽 |
| 143 | + |
| 144 | + alt 向量模型 |
| 145 | + Result -> Result: write_chunk_result() |
| 146 | + note right: 16.1 向量化结果返回\n - 批量传输数据块\n - 高效网络利用\n - 减少序列化开销 |
| 147 | + Result --> Client: 批量数据 |
| 148 | + else 火山模型 |
| 149 | + Result -> Result: write_tuple_result() |
| 150 | + note right: 16.2 迭代式结果返回\n - 逐行获取数据\n - 流式传输模式 |
| 151 | + loop 逐行处理 |
| 152 | + Result --> Client: 单行数据 |
| 153 | + end |
| 154 | + end |
| 155 | + end |
| 156 | +end |
| 157 | + |
| 158 | +Result --> TaskHandler: 完成 |
| 159 | +deactivate Result |
| 160 | + |
| 161 | +TaskHandler --> Server: 处理完成 |
| 162 | +deactivate TaskHandler |
| 163 | + |
| 164 | +Server --> Client: 最终确认 |
| 165 | +deactivate Server |
| 166 | +note right: 17. 完整流程结束\n - 释放所有资源\n - 维护连接状态\n - 准备接收下一条SQL |
| 167 | + |
| 168 | +@enduml |
| 169 | +``` |
0 commit comments