1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 步骤: 1.用户通过MySQL(MySQL协议)客户端向Doris发送查询 2.Doris接收到请求,每个请求封装成一个ConnectContext 3.ConnectScheduler维护一个线程池,每个ConnectContext在一个线程中由ConnectProcessor(负责查询的处理,审计,返回查询结果给客户端)进程处理 4.ConnectProcessor进行SQL的Parse(Java CUP Parser: sql_parser.cup),输入是SQL字符串,输出为AST(StatementBase) ps:一个SelectStmt由SelectList,FromClause,WherePredicate,GroupByClause,HavingPredicate,OrderByElement,LimitElement组成 5.StmtExecutor具体负责查询的执行,对AST进行语法和语义分析 a.检查并绑定Cluster,DataBase,Table,Column等元信息 b.SQL合法性检查:窗口函数不能distinct,HLL和Bitmap列不能sum/count,where中不能有grouping操作 c.SQL重写 d.Table和Column的别名处理 e.Tuple,Slot,表达式分配唯一的ID f.函数参数的合法性检测 g.表达式替换 h.类型检查,类型替换 6.ExprRewriter根据ExprRewriteRule进行重写(重写成功会再次触发语法语义分析) 7.生成单机执行Plan(单机Plan由SingleNodePlanner执行,输入是AST,输出是物理执行Plan) a.Slot物化 b.投影下推: 只会读取必须读取的列 c.谓词下推: 满足语义的前提下过滤条件尽可能下推到Scan节点 d.分区,分桶裁剪 e.Join Reorder: 对于InnerJoin,根据行数调整表的顺序,大表在前 f.Sort+Limit优化成TopN g.MaterializedView选择 8.DistributedPlanner生成PlanFragment树(1个PlanFragment封装了在一台机器上对同一数据集的操作逻辑) 9.Coordinator会负责PlanFragment的执行实例生成
|