sql 循环处理数据_图文介绍 SQL 的三种查询计划处理模型,Spark 用了其中两个
我已經在之前的?《一條 SQL 在 Apache Spark 之旅(上)》、《一條 SQL 在 Apache Spark 之旅(中)》?以及?《一條 SQL 在 Apache Spark 之旅(下)》?這三篇文章中介紹了 SQL 從用戶提交到最后執行都經歷了哪些過程,感興趣的同學可以去這三篇文章看看。
這篇文章中我們主要來介紹 SQL 查詢計劃(Query Plan)常見的處理模型(processing model)。數據庫的處理模型定義了系統如何運行一個查詢計劃,不同的工作負載選擇不同的處理模型。
在進入下面的文章之前,假設我們有以下的 SQL 查詢:
SELECT R.id, S.cdate FROM R JOIN S ON R.id = S.id WHERE S.value > 100 |
根據之前的文章,我們很快就可以將上面這條 SQL 的查詢計劃畫出來:
系統為了處理這個查詢計劃,主要有三種執行模型:
迭代模型(Iterator Model)
物化模型(Materialization Model)
向量化/批處理模型(Vectorized / Batch Model)
下面我們來簡單介紹這三種執行模型的區別。
迭代模型(Iterator Model)
迭代模型又稱 Volcano Model 或者 Pipeline Model。這種模型中的查詢計劃算子(query plan operator)都需要實現?next()?函數:
每次調用的時候,operator 將返回一個元組(tuple)或一個空標記(null),空標記代表數據已經遍歷完;
operator 需要實現一個循環,其調用子 operator 的?next()?函數,用于從子 operator 中獲取數據,然后再處理它。
當今世界上絕大多數關系型數據庫都是使用迭代模型的,比如 SQLite、MongoDB、Impala、DB2、SQLServer、Greenplum、PostgreSQL、Oracle、MySQL 等。我們熟悉的 Apache Spark 1.x 的 SQL 引擎也是基于這個模型做的(參見 Apache Spark作為編譯器:深入介紹新的Tungsten執行引擎)。迭代模型的優點是抽象起來很簡單,很容易實現,而且可以通過任意組合算子來表達復雜的查詢。但是缺點也很明顯,存在大量的虛函數調用,會引起 CPU 的中斷,最終影響了執行效率;而且 Joins, Subqueries, Order By 等操作在其子 operator 返回數據之前會被 block 住。
物化模型(Materialization Model)
物化模型的處理方式是:每個 operator 一次處理所有的輸入,處理完之后將所有結果一次性輸出。由于這種模式中的 operator 其輸出“物化”為單個結果,所以稱為物化模型。在實現中,DBMS 一般會下推一些 hints 以避免掃描太多的數據。注意,這種模式可以返回物化的行數據或者單列數據。物化模型的處理流程如下:
物化模型更適合 OLTP 負載,因為這些查詢每次只訪問小規模的數據,只需要少量的函數調用。
向量化/批處理模型(Vectorized / Batch Model)
Vectorization Model 和 Iterator Model 類似,每個 operator 需要實現一個?next()?函數,但是每次調用?next()?函數會返回一批的元組(tuples)而不是一個元組。在 operator 內部,每次循環都會處理多個元組。批次的大小可以根據硬件或者查詢數據進行配置的。可以看出Vectorization Model 是 Iterator Model 和 Materialization Model 的折衷。向量化模型的處理流程如下:
Vectorization Model 比較適合 OLAP 查詢,因為其大大減少了每個 operator 的調用次數,也就簡單減少了虛函數的調用。而且現代編譯器和 CPU 在運行簡單的循環時,是非常高效的。編譯器會自動展開簡單的循環,甚至在每個 CPU 指令中產生 SIMD 指令來處理多個元組。
Presto(參見 Aria 項目)、snowflake、SQLServer、Amazon Redshift 等數據庫支持這種處理模式。
向量化/批處理模型與大數據
大家熟悉的 Apache Hive 從 0.13.0 版本開始也支持向量化執行模型,參見 HIVE-4160。為了在 Hive 中使用 vectorized query execution,我們必須以 ORC 格式來存儲我們的數據,并且將?hive.vectorized.execution.enabled?參數設置為 true(默認是不開啟的)。
另外,Apache Spark 2.x 的 SQL 引擎開始也支持向量化執行模型,參見 Apache Spark作為編譯器:深入介紹新的Tungsten執行引擎。其效率比 Iterator Model 高出數倍。由于篇幅的原因,我們將在另外一篇文章介紹 Apache Spark 的 Vectorized Query Execution。
猜你喜歡1、經典Hive-SQL面試題
2、在 Hive 中使用 OpenCSVSerde
3、如果你也想做實時數倉…
4、面試官問我Arrays.sort()為什么可以對int等數組進行排序,我跟面試官扯了半個小時
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的sql 循环处理数据_图文介绍 SQL 的三种查询计划处理模型,Spark 用了其中两个的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学习笔记】数据链路层——流量控制:停止
- 下一篇: bcp 不能调用where 子句_技术分