当前位置: 首页 > news >正文

c2c网站代表和网址医院网站开发百度文库

c2c网站代表和网址,医院网站开发百度文库,中山网站建设是什么,陶艺品网站模板一、概述 KaiwuDB 内核解析系列共分上下两部分#xff0c;本文是该系列的第一部分#xff0c;主要涵盖了网络协议到 SQL 执行器#xff0c;解释 KaiwuDB 如何执行 SQL 查询#xff0c;包括系统各个组件的执行路径#xff08;网络协议、SQL 会话管理、解析器、执行计划及优… 一、概述 KaiwuDB 内核解析系列共分上下两部分本文是该系列的第一部分主要涵盖了网络协议到 SQL 执行器解释 KaiwuDB 如何执行 SQL 查询包括系统各个组件的执行路径网络协议、SQL 会话管理、解析器、执行计划及优化、执行器、KV 引擎、事务管理等目的是为各个组件的结构及其之间的关系提供一个高层次的统一视图。 下图是 KaiwuDB SQL 查询执行概览。左侧是 gateway 节点负责接收 SQL Client 的 SQL 查询生成查询计划逻辑计划和物理计划构造分布式执行引擎需要的 FlowSpec 并发送到被查询数据所在的节点。每个节点会根据接收到的 FlowSpec 构造物理计划中的算子并执行然后把数据通过网络返回到 gateway 节点。接下来我们就详细讨论一下各个组件是如何工作的。 二、PostgreSQL Wire Protocol SQL 查询通过 Postgres Wire 协议发送到 KaiwuDB使用 Postgres 协议是为了与现有的客户端驱动和应用程序兼容。这个组件实现了与 Postgres wire 协议相关的功能接口。用户连接后会首先进行鉴权鉴权通过后就会初始化一个循环不断地读取 SQL 语句、执行并返回结果通过封装 golang 的 net.Conn。 这个协议是面向消息的PostgreSQL 消息类型见执行器部分在当前连接的生命周期内会读取一个或多个包含 SQL 语句的消息并将其传递给 SQL 执行器执行一旦 SQL 语句执行完毕并生成结果就会将其序列化并返回给客户端。 PostgreSQL Wire Protocol Server 是在 KaiwuDB 启动的同时初始化的。详细的初始化流程如下图所示。首先KaiwuDB 的 start 命令会通过 server.Start 方法调用 startServeSQL 来初始化 ServConn。ServConn 负责解析 SQL 客户端的请求、检查连接的安全性并处理连接参数然后调用 pgServer.ServConn 方法来处理 SQL Statement。 三、SQL 执行器 KaiwuDB 使用一个端口同时处理 pg/http/grpc 三种协议。在 start 阶段KaiwuDB 实例化 pgServer 来处理 Postgres wire 协议的请求。pgServer 会实例化 KaiwuDB 的 SQL 执行器处理用户查询。 SQL 执行器会作为生产者 Producer持续读取用户输入并调用 parser 解析 SQL 为 statement解析的结果会保存到 Statement bufferStmtBuf中。同时还会创建一个 go routine 作为消费者Consumer按序处理 StmtBuf 中的 SQL statements。 SQL 执行器的具体处理流程如下图所示。首先它会通过 serverImpl 调用 processCommandsAsync 创建一个新的 goroutine来认证客户端连接和处理 Statement bufferStmtBuf中的命令上文提到的消费者。 其返回值是一个用来标示 goroutine 是否结束的 channel。需要注意的是这个 channel 中的任何错误信息都会被忽略因为期间发生的任何错误的详细信息已经通知了 SQL 客户端。processCommandsAsync 还会进行鉴权工作如果鉴权失败这个 goroutine 就会结束并且会调用 cancelConn 关闭整个连接。 接下来serverImpl 会初始化一个 for loop 来接收 SQL 客户端的输入直到连接关闭或者发生错误。此处的 for loop 是作为生产者首先验证 SQL Client 的权限通过后会根据客户端发送的消息类型调用不同的方法。 消息类型定义请参考https://www.postgresql.org/docs/9.4/protocol-message-formats.html 下面的章节会以 handleSimpleQuery 方法为例来说明 SQL 执行器处理 SQL 的过程。 1. SQL 接收与解析 handleSimpleQuery 的目的是用来处理简单 SQL。首先它会从 PostgreSQL Wire Protocol 的缓存中读取一个字符串。如果读取成功这个字符串就会发送给 KaiwuDB 的  SQL parserSQL 解析器。 KaiwuDB 的解析器最初复制于 PostgresSQL随着支持更多的 SQL 语法而逐渐增强。SQL 解析器的输出为 AST抽象语法树数组每个 SQL 语句一个。AST 的节点是由 pkg/sql/sem/tree 中定义的 tree.Statement 结构组成 Go type Statement interface {fmt.StringerNodeFormatterStatementType() StatementType// StatementTag is a short string identifying the type of statement// (usually a single verb). This is different than the Stringer output,// which is the actual statement (including args).// TODO(dt): Currently tags are always pg-compatible in the future it// might make sense to pass a tag format specifier.StatementTag() string } KaiwuDB 实现了使用 tree.Statement 的子类抽象了 SQL 语句的各个子句。比如tree.SelectClause 结构抽象了 SQL 中的 SELECT 子句包括 SELECT 的 From 和 Where 子句。同时AST 树中的许多部分会包含一个或多个 tree.Expr 结构用来表示诸如 l_extendedprice * (1 - l_discount)这样的算术表达式。 Go type SelectClause struct {Distinct boolDistinctOn DistinctOnExprs SelectExprsFrom FromWhere *WhereGroupBy GroupByHaving *WhereWindow WindowTableSelect bool }type BinaryExpr struct {Operator BinaryOperatorLeft, Right ExprtypeAnnotationfn *BinOp } SQL 解析成功后会被添加到 Statement bufer 中等待执行器处理。 下面我们以 TPCH 中的 Q7 为例展示一下 KaiwuDB 中 AST 的结构。 TPCH 的 Q7 是用来查询两个特定国家之间此处为法国和德国在某段时间内1995-01-01 到 1996-12-31的货物运输总价值。 SQL SELECTsupp_nation,cust_nation,l_year, sum(volume) AS revenue FROM (SELECTn1.n_name AS supp_nation,n2.n_name AS cust_nation,extract(year FROM l_shipdate) AS l_year,l_extendedprice * (1 - l_discount) AS volumeFROMsupplier,lineitem,orders,customer,nation n1,nation n2WHEREs_suppkey l_suppkeyAND o_orderkey l_orderkeyAND c_custkey o_custkeyAND s_nationkey n1.n_nationkeyAND c_nationkey n2.n_nationkeyAND ((n1.n_name FRANCE AND n2.n_name GERMANY)or (n1.n_name GERMANY AND n2.n_name FRANCE))AND l_shipdate BETWEEN DATE 1995-01-01 AND DATE 1996-12-31) AS shipping GROUP BYsupp_nation,cust_nation,l_year ORDER BYsupp_nation,cust_nation,l_year; 下图即为 KaiwuDB 中 TPCH Q7 的 AST为了方便展示做了简化处理。每个节点中的白色部分代表空值(nil)表示当前节点不包含该结构紫色部分代表该结构可以展开即指向下个子节点绿色部分代表叶节点。 因为 Q7 是 SELECT 语句其根节点是 tree.Statement 的子类 tree.Select。Q7 中每个 Statement 都被抽象为一个具体的节点比如 ORDER BY 被表示为 tree.OrderByWHERE 子句被表示为 tree.Where 等。 2. SQL 语句执行 上文提到SQL 执行器的消费者 goroutine 会不断地从 Statement buffer 中读取 SQL 的 AST 并执行这个功能是通过 sqlServer.ServeConn 调用 connExecutor 的 execCmd 来实现的其主要流程见下图。 execCmd 方法会不断地读取 stmtBuf 中的内容并执行。每个 SQL 客户端连接初始化的时候KaiwuDB 都会初始化一个用来执行 SQL 的有限状态机FSM它有 5 种状态 stateNoTxn – 用来处理 BEGIN 语句或隐式事务为其开启一个新的事务 stateOpen – 用来执行普通的 SQL 语句 stateAborted – 用来处理 ROLLBACK 语句 stateCommitWait – 用来处理 COMMIT 语句 stateInternalError – 用来处理各种错误比如 eventNonRetriableErr, stateInternalError 等 stmtBuf 的 SQL 指令被添加到状态机后会根据其类型分别处理。普通 SQL 被定义为 ExecStmt 类型会通过调用 connExecutor 的 execStmt 方法运行如上图中所示。 execStmt 方法会首先判断当前状态机的状态如果是 BEGIN 语句则会执行 connExecutor 的 execStmtInNoTxnState 方法创建新的事务如果是普通的 SQL 则会调用 connExecutor 的 execStmtInOpenState 运行。 下图为 execStmtInNoTxnState 创建新事物的过程。如果当前语句是 BEGIN则会开始一个新的事物。如果是 tree.CommitTransaction, tree.ReleaseSavepoint, tree.RollbackTransaction, tree.SetTransaction 或 tree.Savepoint 中的任何一个则会报错其它情况即普通的 SQL 语句则会转换状态机的状态到 stateOpen 并创建一个隐式事务。 事务创建成功并且状态机的状态转换为 stateOpen 后SQL 就会进入执行阶段这部分内容会在后续文章中详细介绍。
http://www.hkea.cn/news/14379268/

相关文章:

  • 西安网站建设-中国互联网站定位 怎么做
  • 家居网站建设公司排名广州seo代理
  • 昆明企业网站设计公司关于单位网站建设的报告
  • 中国建设银行网站密码是什么意思汽车设计网站
  • 91大神网站建设注册公司步骤
  • 东莞国网站建设wordpress 多语言网站
  • win7做网站服务器卡免费公司网站制作
  • 房产网站推广网站左悬浮代码
  • 杭州行业网站建设公司wordpress怎么新建模块
  • 机械设备公司网站制作新开传奇手游新服网
  • 哪个网站做兼职如何查看一个网站是不是用h5做的
  • 成都网站开发培训多少钱wordpress发邮件更新
  • 建设网站网桂林 网
  • 小企业公司网站怎么建学习网站导航
  • 网站建设与运营就业传统企业如何做好网络推广
  • 织梦网站去除技术支持怎么了解百度蜘蛛到哪个网站
  • wordpress静态化占内存么做百度手机网站优化快
  • 厦门建设管理局网站首页国内的电商平台
  • 行业查询网站网站建设需求建议书
  • 在线游戏网站完整网站开发视频教程
  • 静态宠物网站设计论文青岛网站制作服务商
  • 公众号建网站家具网站开发
  • 做网站市场价金华网站建设电话
  • 百度站长平台账号购买社交app定制
  • 高端的丹阳网站建设wordpress评论添加验证
  • 湖北网站建设哪里有福州网络营销推广公司
  • 学网站开发需要会什么app免费下载入口
  • 网站逻辑结构优化国外的建筑设计案例网站
  • 潍坊网站建设app个人简历模板大全
  • 网站流量超限html怎么写