亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、什么是 SQL

 

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

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

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

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

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

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

二、如何執行 SQL

2.1 MySQL

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

SQL從提交到執行到底經歷了什么

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

Bision: 根據 mysql 定義的語法規則,進行語法解析,語法解析就是生成語法樹的過程。核心是如何涉及合適的存儲結構以及相關算法,去存儲和遍歷所有的信息

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

SQL從提交到執行到底經歷了什么

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

引申點:

a. 語法樹生成規則

b. mysql 的優化規則

2.2 hive sql

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

hive 架構圖:

SQL從提交到執行到底經歷了什么

Driver:

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

hiveSql 的執行流程如下:

SQL從提交到執行到底經歷了什么

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

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

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

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

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

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

(6)Phsical Optimizer:進行物理執行計劃優化,生成優化后的 tasktree,該任務即是集群上的執行的作業

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

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

AST 語法樹舉例:

SQL從提交到執行到底經歷了什么

引申學習:

a. 從 hivesql 的執行機制可以看出,hive 并不適合用于聯機事務處理,無法提供實時查詢功能;最適合應用在基于大量不可變數據的批處理作業

b. Antlr 的解析流程

c. hive 的優化規則

2.3 flink sql

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

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

SQL從提交到執行到底經歷了什么

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

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

(3)到達這步后,只是將 SQL 解析到 java 數據結構的固定節點上,并沒有給出相關節點之間的關聯關系以及每個節點的類型信息。

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

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

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

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

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

Flink SQL 使用 Apache Calcite 作為解析器和優化器

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

引申學習:

a. flink sql 優化規則

三、常見 SQL 解析引擎

SQL從提交到執行到底經歷了什么

持續補充 ing...

四、總結

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

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

 

作者:京東科技 李丹楓
來源:京東云開發者社區 轉載請注明來源

分享到:
標簽:SQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定