自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

老知識復盤-SQL從提交到執(zhí)行到底經(jīng)歷了什么

數(shù)據(jù)庫 其他數(shù)據(jù)庫
Calcite 中的優(yōu)化器RelOptPlanner有兩種,一是基于規(guī)則優(yōu)化(RBO)的HepPlanner,二是基于代價優(yōu)化(CBO)的VolcanoPlanner。然后得到優(yōu)化后的RelNode, 再基于Flink里面的rules將優(yōu)化后的邏輯計劃轉(zhuǎn)換成物理計劃。

一、什么是SQL

sql(Structured Query Language: 結(jié)構(gòu)化查詢語言)是高級的費過程化編程語言,允許用戶在高層數(shù)據(jù)結(jié)構(gòu)上工作, 是一種數(shù)據(jù)查詢和程序設(shè)計語言, 也是(ANSI)的一項標準的計算機語言. but... 目前仍然存在著許多不同版本的sql語言,為了與ANSI標準相兼容, 它們必須以相似的方式共同地來支持一些主要的命令(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等).

在標準SQL中, SQL語句包含四種類型

DML(Data Manipulation Language):數(shù)據(jù)操作語言,用來定義數(shù)據(jù)庫記錄(數(shù)據(jù))。

DCL(Data Control Language):數(shù)據(jù)控制語言,用來定義訪問權(quán)限和安全級別。

DQL(Data Query Language):數(shù)據(jù)查詢語言,用來查詢記錄(數(shù)據(jù))。

DDL(Data Definition Language):數(shù)據(jù)定義語言,用來定義數(shù)據(jù)庫對象(庫,表,列等)

二、如何執(zhí)行SQL

2.1 mysql

以mysql為例, sql執(zhí)行流程大致分為以下節(jié)點(mysql server層代碼, 不包含引擎層事務(wù)/log等操作):

mysqlLex: mysql自身的詞法分析程序, C++語言開發(fā), 基于輸入的語句進行分詞, 并解析除每個分詞的意義. 分詞的本質(zhì)便是正則表達式的匹配過程. 源碼在sql/sql_lex.cc

Bision: 根據(jù)mysql定義的語法規(guī)則,進行語法解析,語法解析就是生成語法樹的過程. 核心是如何涉及合適的存儲結(jié)構(gòu)以及相關(guān)算法,去存儲和遍歷所有的信息

語法解析中,生成語法樹:

mysql分析器: SQL解析, 針對關(guān)鍵詞/非關(guān)鍵詞進行提取、解析, 并生成解析語法樹. 如果分析到語法錯誤,會拋出異常: ERROR: You have an error in your SQL syntax. 同時該階段也會做一些校驗, 如不存在字段會拋出異常: unknow column in field list.

引申點:

a. 語法樹生成規(guī)則

b. mysql的優(yōu)化規(guī)則

2.2 hive sql

Hive 是基于Hadoop 構(gòu)建的一套數(shù)據(jù)倉庫分析系統(tǒng),它提供了豐富的SQL查詢方式來分析存儲在Hadoop 分布式文件系統(tǒng)中的數(shù)據(jù),可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供完整的SQL查詢功能,可以將SQL語句轉(zhuǎn)換為MapReduce任務(wù)進行運行,通過自己的SQL 去查詢分析需要的內(nèi)容,這套SQL 簡稱Hive SQL,使不熟悉mapreduce 的用戶很方便的利用SQL 語言查詢,匯總,分析數(shù)據(jù)

hive架構(gòu)圖:

Driver:

輸入了sql字符串,對sql字符串進行解析,轉(zhuǎn)化程抽象語法樹,再轉(zhuǎn)化成邏輯計劃,然后使用優(yōu)化工具對邏輯計劃進行優(yōu)化,最終生成物理計劃(序列化反序列化,UDF函數(shù)),交給Execution執(zhí)行引擎,提交到MapReduce上執(zhí)行(輸入和輸出可以是本地的也可以是HDFS/Hbase)見下圖的hive架構(gòu)

hiveSql的執(zhí)行流程如下:

sql寫出來以后只是一些字符串的拼接,所以要經(jīng)過一系列的解析處理,才能最終變成集群上的執(zhí)行的作業(yè)

(1)Parser:將sql解析為AST(抽象語法樹),會進行語法校驗,AST本質(zhì)還是字符串

(2)Analyzer:語法解析,生成QB(query block)

(3)Logicl Plan:邏輯執(zhí)行計劃解析,生成一堆Opertator Tree

(4)Logical optimizer:進行邏輯執(zhí)行計劃優(yōu)化,生成一堆優(yōu)化后的Opertator Tree

(5)Phsical plan:物理執(zhí)行計劃解析,生成tasktree

(6)Phsical Optimizer:進行物理執(zhí)行計劃優(yōu)化,生成優(yōu)化后的tasktree,該任務(wù)即是集群上的執(zhí)行的作業(yè)

結(jié)論:經(jīng)過以上的六步,普通的字符串sql被解析映射成了集群上的執(zhí)行任務(wù),最重要的兩步是 邏輯執(zhí)行計劃優(yōu)化和物理執(zhí)行計劃優(yōu)化(圖中紅線圈畫)

Antlr: Antrl是一種語言識別的工具, 基于java開發(fā), 可以用來構(gòu)造領(lǐng)域語言. 它提供了一個框架,可以通過包含java, C++, 或C#動作(action)的語法描述來構(gòu)造語言識別器, 編譯器和解釋器.Antlr完成了hive 詞法分析、語法分析、語義分析、中間代碼生成的過程.

AST語法樹舉例:

引申學習:

a. 從hivesql的執(zhí)行機制可以看出, hive并不適合用于聯(lián)機事務(wù)處理, 無法提供實時查詢功能;最適合應(yīng)用在基于大量不可變數(shù)據(jù)的批處理作業(yè)

b. Antlr的解析流程

c. hive的優(yōu)化規(guī)則

2.3 flink sql

Flink SQL是Flink中最高級的抽象, 可以劃分為 SQL --> Table API --> DataStream/DataSetAPI --> Stateful Stream Processing

Flink SQL包含 DML 數(shù)據(jù)操作語言、 DDL 數(shù)據(jù)語言, DQL 數(shù)據(jù)查詢語言,不包含DCL語言。

(1)首先,F(xiàn)linkSQL 底層使用的是 apache Calcite 引擎來處理SQL語句,Calcite會使用 javaCC 做SQL解析,javaCC根據(jù)Calcite中定義的 Parser.jj 文件,生成一系列的java代碼,生成的java代碼會把SQL轉(zhuǎn)換成AST抽象語法樹(即SQLNode類型)。

(2)生成的 SqlNode 抽象語法樹,他是一個未經(jīng)驗證的抽象語法樹,這時 SQL Validator 會獲取 Flink Catalog 中的元數(shù)據(jù)信息來驗證 sql 語法,元數(shù)據(jù)信息檢查包括表名,字段名,函數(shù)名,數(shù)據(jù)類型等檢查。然后生成一個校驗后的SqlNode。

(3)到達這步后,只是將 SQL 解析到 java 數(shù)據(jù)結(jié)構(gòu)的固定節(jié)點上,并沒有給出相關(guān)節(jié)點之間的關(guān)聯(lián)關(guān)系以及每個節(jié)點的類型信息。

所以,還需要將 SqlNode 轉(zhuǎn)換為邏輯計劃,也就是LogicalPlan,在轉(zhuǎn)換過程中,會使用 SqlToOperationConverter 類,來將 SqlNode 轉(zhuǎn)換為 Operation,Operation 會根據(jù)SQL語法來執(zhí)行創(chuàng)建表或者刪除表等操作,同時FlinkPlannerImpl.rel()方法會將SQLNode轉(zhuǎn)換成RelNode樹,并返回RelRoot。

(4)第4步將執(zhí)行 Optimize 操作,按照預定義的優(yōu)化規(guī)則 RelOptRule 優(yōu)化邏輯計劃。

Calcite 中的優(yōu)化器RelOptPlanner有兩種,一是基于規(guī)則優(yōu)化(RBO)的HepPlanner,二是基于代價優(yōu)化(CBO)的VolcanoPlanner。然后得到優(yōu)化后的RelNode, 再基于Flink里面的rules將優(yōu)化后的邏輯計劃轉(zhuǎn)換成物理計劃。

(5)第5步 執(zhí)行 execute 操作,會通過代碼生成 transformation,然后遞歸遍歷各節(jié)點,將DataStreamRelNode 轉(zhuǎn)換成DataStream,在這期間,會依次遞歸調(diào)用DataStreamUnion、DataStreamCalc、DataStreamScan類中重寫的 translateToPlan方法。遞歸調(diào)用各節(jié)點的translateToPlan,實際是利用CodeGen元編成Flink的各種算子,相當于直接利用Flink的DataSet或者DataStream開發(fā)程序。

(6)最后進一步編譯成可執(zhí)行的 JobGraph 提交運行。

Flink SQL使用 Apache Calcite 作為解析器和優(yōu)化器

Calcite : 一種動態(tài)數(shù)據(jù)管理框架,它具備很多典型數(shù)據(jù)庫管理系統(tǒng)的功能 如SQL 解析、 SQL 校驗、 SQL 查詢優(yōu)化、 SQL 生成以及數(shù)據(jù)連接查詢等,但是又省略了一些關(guān)鍵的功能,如 Calcite并不存儲相關(guān)的元數(shù)據(jù)和基本數(shù)據(jù),不完全包含相關(guān)處理數(shù)據(jù)的算法等。

引申學習:

a. flink sql優(yōu)化規(guī)則

三、常見SQL解析引擎

解析引擎

開發(fā)語言

使用場景

總結(jié)

antlr

java

presto

1. 包含三大主要功能: 詞法分析器、語法分析器、樹解析器2. 支持定義領(lǐng)域語言

calcite

javaCC

flink

1. 抽象語法樹2. 支持使用 FreeMarker 模版引擎擴展語法3. 能夠與數(shù)據(jù)庫創(chuàng)建查詢

持續(xù)補充ing...

四、總結(jié)

在實際工作過程中會涉及到相關(guān)的sql優(yōu)化, 比如將非研發(fā)的業(yè)務(wù)老師寫的復雜嵌套sql后臺自動改為非嵌套執(zhí)行,提高查詢性能. 支持redisSQL, 以標準SQL格式解析成后臺可執(zhí)行的redis命令. 目前采用的開源jsqlparser框架來實現(xiàn)語法樹的解析, 好處是操作簡單, 只對sql語句進行拆分, 解析成java類的層次結(jié)構(gòu),支持visitor模式, 與數(shù)據(jù)庫無關(guān). 缺點是只支持常見的SQL語法集, 如若要擴展語法需改其源碼, 對代碼的侵入性與維護性造成影響.想要做好sql解析優(yōu)化相關(guān)的工作, 還是要深入了解sql的執(zhí)行原理, 了解各個sql引擎的特點與優(yōu)劣. 站在架構(gòu)的角度來思考來思考問題.

工欲善其事,必先利其器.

作者:京東科技 李丹楓

來源:京東云開發(fā)者社區(qū) 轉(zhuǎn)載請注明來源

責任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2017-12-04 09:26:56

架構(gòu)師碼農(nóng)菜鳥

2019-01-07 09:15:10

BAT技術(shù)互聯(lián)網(wǎng)Java

2020-03-18 08:56:27

頁面網(wǎng)址內(nèi)容

2023-10-06 15:29:07

MySQL數(shù)據(jù)庫更新

2023-07-24 07:57:23

C++標準功能

2021-10-13 06:49:14

事故復盤ID

2023-03-03 10:04:11

2017-11-14 16:38:05

智慧新城

2022-05-26 23:36:36

SQLMySQL數(shù)據(jù)

2020-04-15 09:35:59

Flutter圖片優(yōu)化

2021-10-08 10:05:10

數(shù)據(jù)包三次握手HTTP

2019-07-11 12:36:01

AR設(shè)計圖像檢測法

2021-05-26 10:40:28

Vue3TypeScript前端

2024-07-16 11:51:54

數(shù)據(jù)復盤報告

2018-08-07 16:21:27

計算機知識能力

2015-03-09 17:49:40

SDN

2015-04-14 10:24:57

2016-08-04 14:53:34

服務(wù)器虛擬化網(wǎng)絡(luò)

2015-10-16 10:17:55

復盤手游80天環(huán)游地球

2011-12-01 14:06:32

點贊
收藏

51CTO技術(shù)棧公眾號