发布网友 发布时间:2024-10-19 23:06
共1个回答
热心网友 时间:2024-10-19 23:20
本文为KaiwuDB内核解析系列的第一部分,旨在阐述KaiwuDB如何执行SQL查询,从网络协议到SQL执行器,全面覆盖系统组件的执行路径。下文将详细解析各个组件的工作机制,为用户提供一个全面的系统视图。
在KaiwuDB SQL查询执行概览中,左侧的gateway节点负责接收SQL客户端的查询请求,生成查询计划,并构造分布式执行引擎所需的FlowSpec,将这些信息发送至数据所在节点。每个节点接收FlowSpec后,根据接收到的信息构造物理计划并执行,最终将结果通过网络返回至gateway节点。
在PostgreSQL Wire Protocol部分,SQL查询通过与Postgres兼容的协议发送至KaiwuDB。该组件实现与Postgres wire协议相关的功能接口,实现用户连接的鉴权、初始化循环读取SQL语句、执行并返回结果。此协议基于消息驱动机制,用于在连接生命周期内读取并执行SQL语句,生成结果后序列化返回至客户端。
KaiwuDB在启动时初始化PostgreSQL Wire Protocol Server,该初始化流程涉及ServConn的解析、安全性检查、连接参数处理,最终通过pgServer.ServConn方法处理SQL Statement。
在SQL执行器部分,KaiwuDB使用一个端口同时处理pg/http/grpc协议,并实例化pgServer处理Postgres wire协议请求。执行器作为生产者持续读取用户输入,通过解析器将SQL语句解析为statement,并将结果保存至Statement buffer。同时,一个消费者线程按序处理缓冲区中的SQL statements。
执行器处理流程包括创建goroutine进行认证和Statement buffer中命令处理。过程中通过processCommandsAsync方法创建处理逻辑,返回用于标识goroutine结束的channel,忽略期间可能发生的错误,仅在鉴权失败时结束并关闭连接。接着,执行器通过serverImpl初始化循环接收SQL客户端输入,根据消息类型调用相应方法处理。
处理SQL的具体步骤包括读取PostgreSQL Wire Protocol缓存的字符串,发送至SQL解析器,解析结果生成AST(抽象语法树)。解析器支持多种SQL语法,并将输出抽象为tree.Statement结构,如SelectClause、OrderBy等。以TPCH中的Q7为例,展示KaiwuDB中AST结构,展示SQL语句的各个子句和表达式。
在SQL语句执行阶段,执行器的消费者线程不断从Statement buffer读取AST并执行。执行流程通过sqlServer.ServeConn调用connExecutor的execCmd方法实现,该方法根据状态机处理不同类型的SQL指令。状态机包含多种状态,处理普通SQL指令时,执行相应的执行逻辑,创建事务或运行SQL语句。
创建新事务的过程涉及判断当前语句类型,如果是BEGIN,则开始新事务;若为tree.CommitTransaction、tree.ReleaseSavepoint、tree.RollbackTransaction、tree.SetTransaction或tree.Savepoint中的任意一条,则报错。对于普通SQL语句,状态机转换至stateOpen并创建隐式事务,然后进入执行阶段。
在后续文章中,我们将详细介绍事务创建成功后SQL执行阶段的详细内容。
热心网友 时间:2024-10-19 23:15
本文为KaiwuDB内核解析系列的第一部分,旨在阐述KaiwuDB如何执行SQL查询,从网络协议到SQL执行器,全面覆盖系统组件的执行路径。下文将详细解析各个组件的工作机制,为用户提供一个全面的系统视图。
在KaiwuDB SQL查询执行概览中,左侧的gateway节点负责接收SQL客户端的查询请求,生成查询计划,并构造分布式执行引擎所需的FlowSpec,将这些信息发送至数据所在节点。每个节点接收FlowSpec后,根据接收到的信息构造物理计划并执行,最终将结果通过网络返回至gateway节点。
在PostgreSQL Wire Protocol部分,SQL查询通过与Postgres兼容的协议发送至KaiwuDB。该组件实现与Postgres wire协议相关的功能接口,实现用户连接的鉴权、初始化循环读取SQL语句、执行并返回结果。此协议基于消息驱动机制,用于在连接生命周期内读取并执行SQL语句,生成结果后序列化返回至客户端。
KaiwuDB在启动时初始化PostgreSQL Wire Protocol Server,该初始化流程涉及ServConn的解析、安全性检查、连接参数处理,最终通过pgServer.ServConn方法处理SQL Statement。
在SQL执行器部分,KaiwuDB使用一个端口同时处理pg/http/grpc协议,并实例化pgServer处理Postgres wire协议请求。执行器作为生产者持续读取用户输入,通过解析器将SQL语句解析为statement,并将结果保存至Statement buffer。同时,一个消费者线程按序处理缓冲区中的SQL statements。
执行器处理流程包括创建goroutine进行认证和Statement buffer中命令处理。过程中通过processCommandsAsync方法创建处理逻辑,返回用于标识goroutine结束的channel,忽略期间可能发生的错误,仅在鉴权失败时结束并关闭连接。接着,执行器通过serverImpl初始化循环接收SQL客户端输入,根据消息类型调用相应方法处理。
处理SQL的具体步骤包括读取PostgreSQL Wire Protocol缓存的字符串,发送至SQL解析器,解析结果生成AST(抽象语法树)。解析器支持多种SQL语法,并将输出抽象为tree.Statement结构,如SelectClause、OrderBy等。以TPCH中的Q7为例,展示KaiwuDB中AST结构,展示SQL语句的各个子句和表达式。
在SQL语句执行阶段,执行器的消费者线程不断从Statement buffer读取AST并执行。执行流程通过sqlServer.ServeConn调用connExecutor的execCmd方法实现,该方法根据状态机处理不同类型的SQL指令。状态机包含多种状态,处理普通SQL指令时,执行相应的执行逻辑,创建事务或运行SQL语句。
创建新事务的过程涉及判断当前语句类型,如果是BEGIN,则开始新事务;若为tree.CommitTransaction、tree.ReleaseSavepoint、tree.RollbackTransaction、tree.SetTransaction或tree.Savepoint中的任意一条,则报错。对于普通SQL语句,状态机转换至stateOpen并创建隐式事务,然后进入执行阶段。
在后续文章中,我们将详细介绍事务创建成功后SQL执行阶段的详细内容。