談談SQL計算存儲引擎中的索引和計算

背景

最近在這家公司做了一些事情,做的事情和以往的工作不太一樣,不一樣的點呢就是 之前我主要的工作是關注計算這方面,因為數據量大,研究的是怎么加速查詢,怎么研究規則去優化,怎么去解規則的bug等等。因為現在業務的不同,每次獲取的數據量比較小,更加關注的索引效率,計算方面可能只是一些簡單的SUM AVG等。
接下來談談我對這個計算存儲引擎的理解與認知:

什么是SQL計算存儲引擎

SQL計算存儲引擎是利用SQL的能力進行計算,而用戶無需擔心后臺計算的細節,而且計算需要用到的數據都是在這個計算存儲引擎里。
它包括兩個部分,一個是計算部分:包括SQL解析,SQL優化,SQL執行; 一個是存儲部分,包括數據格式的存儲,數據的獲取。

SQL計算以及優化

如果單純從計算的角度來說話的,這類的引擎典型的有 Spark離線引擎,Flink實時引擎,presto adhoc引擎, 這種不關心數據的存儲,也就是說這類沒有存儲能力。這種往往在運行的時候,是從遠端拉取數據,拉數據數據來以后再進行計算。
從大的方面來說,SQL計算引擎 一般會包括任務調度和SQL計算。

任務調度

任務調度的模式一般包括 Spark 的 StageByStage 調度模式 和Flink 的 AllAtOnce 調度模式。
第一種模式:stageByStage, 這種是典型的離線調度模型,這種調度模型的運行方式為 一組任務按照Stage的方式進行組織,只有上一個Stage的所有Task運行完了以后下一個Stage才能繼續執行,這種方式的好處是任務的失敗的容錯性高,因為stage與stage之間的數據交互會進行暫存,一個任務或者stage的失敗,可以繼續從容錯點恢復重試執行。而且這種方式可以充分利用數據的親和性,也就是說,下游stage的任務可以依賴上游任務的分布情況來進行調度,比如說把下游Task調度到上游Task運行的節點上,這樣一來,就無須再進行遠程數據的拉取,直接從本地讀取數據,可以減少數據的拉取時間.
這種模式下,任務的調度和執行是穿插在一起的。
在這里插入圖片描述

第二種模式:AllAtOnce,這種模式是典型的流式調度模型,也就是在任務執行之前,調度器會根據策略進行Task的調度了,這個時候每個任務在哪個節點執行都已經固定好了,之后所有的數據處理就像流水線一樣,來一個處理一個,這個階段Task的調度就是閑置狀態。所以這種模式的時效性很好,數據的延遲低。但是如果Task失敗或者task所在的容器重啟了,這個時候調度器會重新調度Task。
在這里插入圖片描述

SQL計算

SQL計算的話,一般會包括SQL部分,以及SQL轉換成引擎底層API的部分,從整個引擎的發展來看,一般是先提供API接口,用戶寫底層的API進行調用,后著才慢慢的出現SQL引擎,這種SQL使用起來對用戶是友好的,當然這后面邏輯的轉換也會經過很多步驟:

  • SQL解析為AST
  • AST轉為邏輯計劃
  • 邏輯計劃優化為優化計劃
  • 優化計劃換轉為物理計劃
  • 物理計劃轉換為可執行的底層API

這種SQL的解析,目前從大部分開源框架的用的趨勢來看,ANTLR4 是主流,只有一小部分,比如說Flink 用的是 Calcite,不得不說 ANTLR4還是挺好用的,這個階段主要是判斷語法的合規性,是不是符合定義的語法規則。
再者是 AST轉換為邏輯計劃,這個階段主要是y結合元數據做一些校驗,比如說 檢查表存不存在,字段合不合理,函數存不存在等。

優化計劃這一部分,這里面包括的內容就比較多了,但是一般來說,一種是基于規則的(RBO),一種是基于代價的(CBO)的。
這兩種也不是非黑即白的,主要看側重于那一方。
比如說,Spark主要是RBO,但是在join轉換的部分,也是會基于CBO的(AQE),AQE也就是說基于運行時的指標信息來及時調整運行的計劃以達到更好的加速效果。
又比如說 StarRocks 主要是基于CBO的,但是這種CBO的話,也是在RBO規則的下的,比如說這種常量折疊等這種都是RBO。而且這種CBO也有一部分是估算的,也沒有精確的數值。

優化計劃轉換為物理計劃這一塊,這一塊主要是轉換為可執行的物理計劃,也就是說這里的物理計劃都是可以執行了,調用某個方法就會返回對應的API的調用,比如說
Spark中RowDataSourceScanExec這里的doExecute方法就是返回RDD,Flink也是如此。
當然這里還有一個很大的部分就是代碼生成,這里主要就是為了減少虛函數的調用而采用的一種提速的方法,這種是因為JVM語言存在多態函數的二次尋址。

SQL優化

這一部分主要是從以下方面來優化

  • 使獲取的數據盡可能的少,減少計算的數據量
  • 使中間任務傳輸的數據盡可能的少,減少傳輸帶來的開銷
  • 盡量減少shuffle的數據量,或者消除shuffle
  • 減少shuffle所需要的時間

比如說
hashjoin轉換為 broadcastJoin 就是 消除shuffle
hashjoin轉為換sortmergejoin 就是減少shuffle需要的時間
runtimefilter 就是減少傳輸的數據量
謂詞下推 就是使獲取的數據盡可能的少

數據的存儲與索引

對于沒有自身存儲系統的計算引擎

這種引擎其實是沒沒有索引一說的,因為你無法快速的定位到某一行數據,這種如果想加速的話,只能依靠存儲系統的本身一種快讀過濾機制,就拿現在流行的數據湖來說,如paimon或者delta,他們的底層文件存儲是列式存儲,比如說parquet。
這種引擎如果想快速的過濾出出數據的話,得依靠parquet這個底層文件系統自帶的統計信息,比如說最大最小值,又或者說布隆過濾器(Bloom Filter),這些是基于rowgroup級別的來的,也就是說這些過濾器能夠做到快讀的跳過文件。
或者從計算層級來加速,比如說字典編碼,這種把String的比較轉換為整數的比較。
當然也可可以通過文件的布局來進行加速,比如說Zorder

對于帶有自身存儲的計算引擎

這種引擎的話,大部分是存算一體的,也就是說計算和存儲耦合在一起,這種引擎在寫入數據的時候,往往會進行索引的建立,比如說主鍵索引(能夠快速定位到某一行數據),bitmap索引(能夠快讀定位過濾條件所在的行),聚簇索引(能夠根據聚簇鍵進行快速查詢)。
但是需要注意的是,這種索引是需要單獨維護的,尤其在大量數據更新的場景下,索引的維護也需要一定的開銷。不像前者,前者是把這些信息存儲在文件的元數據信息里。

點查

這里需要單獨說一下這個點查,大部分都是通過主鍵來查找來達到點查的效果的。
這里的如果要有點查的效果,必須是針對于帶有自身粗處的計算引擎。
以上所過,我們寫完SQL以后會進入到優化器以及調度環節,但是對于點查不一樣,它只需要簡單的優化,調度環節的的話直接越過。
為什么跳過呢?
因為我們是簡單的查詢,沒有計算,只需要查詢對應的數據,無需要進行Task的調度。就拿Starrocks來說,一個SQL的調度可能就需要花費20多毫秒

- -- Deploy[1] 23ms-     -- DeployLockInternalTime[1] 23ms-         -- DeploySerializeConcurrencyTime[1] 0-         -- DeployStageByStageTime[3] 0-         -- DeployWaitTime[3] 23ms-             -- DeployAsyncSendTime[1] 0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918258.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode.window.activeTextEditor 獲取不到 png 圖片路徑問題

vscode 的 extensions 插件開發時用 vscode.window.activeTextEditor?.document.uri 獲取不到編輯器打開的圖片路徑,文檔路徑可以獲取到。個人猜測因為圖片不能編輯,所以沒有 activeTextEditor 屬性吧。解決辦法:巧用右鍵獲取路徑和相對的路…

Java 大視界 -- Java 大數據在智能醫療手術機器人操作數據記錄與性能評估中的應用(390)

Java 大視界 -- Java 大數據在智能醫療手術機器人操作數據記錄與性能評估中的應用(390)引言:正文:一、傳統手術機器人的 “黑箱困境”:記不全、算不清、追不到1.1 設備與臨床的 “斷層”1.1.1 數據記錄 “太粗放”1.1.…

C++的結構體指針

結構體變量和結構體指針的區別特性結構體變量結構體指針存儲內容結構體的實際數據內存地址內存開銷結構體總大小固定4/8字節(指針大小)成員訪問運算符.->函數傳參時的行為值拷貝(新副本)地址傳遞(操作原數據&#x…

pdf文件轉word免費使用幾個工具

在線工具(無需安裝) Smallpdf ? 核心功能: 網頁端直接操作,支持 PDF 與 Word 格式互轉 免費用戶每日限 2 次轉換(免注冊) 自動清除服務器文件,確保隱私安全 🔗 訪問鏈接&#xff1a…

Vue3 組件化開發

文章目錄前言組件化開發底部菜單 TabMenu父子組件相互傳數據父傳子:自定義屬性子傳父:自定義事件父子組件互傳案例插槽 slot多個插槽總結組件化開發總結Vue組件的基本組成子組件使用的三個步驟父子組件相互傳遞數據前言 提示:這里可以添加本…

服務器硬件電路設計之I2C問答(二):I2C總線的傳輸速率與上拉電阻有什么關系?

I2C 總線傳輸速率與上拉電阻關系密切。上拉電阻阻值決定總線電平切換速度:電阻越小,充放電電流越大,信號邊沿更陡,支持更高速率(如 400kHz 快速模式);電阻過大則切換慢,限制速率&…

大語言模型提示工程與應用:LLMs文本生成與數據標注實踐

提示詞應用實踐 學習目標 本課程通過LLMs生成情感分析樣本和標注葡萄9品鑒數據,展示了其文本生成和數據標注能力。同時,利用PAL模型解決日期計算問題,學習了LLMs與編程運行時結合實現復雜推理的方法,為自然語言處理應用提供了實…

node.js 零基礎入門

Node.js 零 基礎入門與核心語法 適用對象:完全沒接觸過 Node.js 的同學 目標:從 0 到能寫 CLI、小型 HTTP 服務、文件腳本、調用系統/網絡資源 目錄 什么是 Node.js安裝與運行運行腳本與 REPL模塊體系:CommonJS 與 ES Modules基礎語法在 Node…

《Day3-PyTorch 自動微分入門:從計算圖到梯度下降的實踐指南》

八、自動微分自動微分模塊torch.autograd負責自動計算張量操作的梯度,具有自動求導功能。自動微分模塊是構成神經網絡訓練的必要模塊,可以實現網絡權重參數的更新,使得反向傳播算法的實現變得簡單而高效。1. 基礎概念張量Torch中一切皆為張量…

apache cgi測試

test.cgi #!/bin/sh echo "Content-type: text/html" echo "" echo "<h1>Hello from a Mac CGI script!</h1>" echo "<p>Current time is: $(date)</p>"?% 放置目錄 /opt/homebrew/Cellar/mapserver/8.4.0_1…

力扣 30 天 JavaScript 挑戰 第二題筆記

這道題是涉及知識–閉包 1. 閉包定義以及相關知識點 官方定義為&#xff1a;在 JavaScript 中&#xff0c;函數具有對在相同作用域以及任何外部作用域中聲明的所有變量的引用。這些作用域被稱為函數的 詞法環境。函數與其環境的組合被稱為 閉包。 簡單理解&#xff1a;內層函數…

OpenAI GPT-5 深度解析:API Key定價與ChatGPT(Free, Plus, Pro)用戶的區別

前言&#xff1a;兩年等待&#xff0c;只為這一躍 在科技圈長達兩年的屏息期待與無盡猜想之后&#xff0c;2025年8月8日北京時間凌晨&#xff0c;OpenAI終于揭開了其新一代旗艦模型——GPT-5的神秘面紗。這不僅僅是一次常規的產品迭代&#xff0c;更被整個行業視為一塊試金石&a…

ClickHouse集群部署實踐---3分片2副本集群

ClickHouse集群部署實踐—3分片2副本集群 未完待續。。。 喜歡的先點贊收藏&#xff01;&#xff01; 由于我們準備部署的是3分片2副本的集群&#xff0c;現在來解釋一下配置參數的意思&#xff1a; shard標簽代表分片的意思&#xff0c;如上圖我們有3個分片&#xff0c;clickh…

Unity_VR_Pico開發手冊

文章目錄一、配置開發環境1.下載PICO Unity Integration SDK2.安裝 Unity 編輯器&#xff08;添加安卓開發平臺模塊&#xff09;3.導入下載的SDK4.項目配置和切換開發平臺5.導入 XR Interaction Toolkit6.安裝 Universal RP(通用渲染管線)并設置 (選做)二、調試環境搭建&#x…

Linux系統之Docker命令與鏡像、容器管理

目錄 一、 Docker命令 docker命令幫助 docker常用子命令&#xff08;必須背會&#xff09; docker管理子命令(暫時不需要) swarm集群管理子命令&#xff08;不需要&#xff09; docker容器管理子命令&#xff08;必須背會&#xff09; docker全局選項 二、 docker鏡像管…

比亞迪第五代DM技術:AI能耗管理的深度解析與實測驗證

比亞迪第五代DM技術&#xff1a;AI能耗管理的深度解析與實測驗證 &#xff08;面向新能源汽車研發/測試工程師&#xff09;目錄 技術背景與核心突破AI能耗管理系統架構解析關鍵技術創新點 2.1 動力域三腦合一控制2.2 全溫域熱管理協同2.3 導航數據深度耦合 實測數據與場景驗證 …

sqli-labs通關筆記-第37關POST寬字符注入(單引號閉合 手工注入+腳本注入 3種方法)

目錄 一、寬字符注入 二、sqlmap之unmagicquotes 三、addslashes與mysqli_real_escape_string 四、源碼分析 1、代碼審計 2、SQL注入安全性分析 五、滲透實戰 1、進入靶場 2、正確用戶名密碼探測 3、手工注入&#xff08;方法1&#xff09; &#xff08;1&#xff…

Kubernetes 集群密鑰與機密管理方案對比分析:Vault、Sealed Secrets 與 AWS KMS

Kubernetes 集群密鑰與機密管理方案對比分析&#xff1a;Vault、Sealed Secrets 與 AWS KMS 在容器化與編排環境中&#xff0c;機密&#xff08;Secrets&#xff09;管理是確保應用安全性的重要環節。對于 Kubernetes 集群而言&#xff0c;內置的 Secret 對象存在明文存儲的風…

Java基礎-TCP通信單服務器接受多客戶端

目錄 案例要求&#xff1a; 實現思路&#xff1a; 代碼&#xff1a; User類&#xff1a;用戶端 Client類&#xff1a;服務端 ServerReader類&#xff1a;多線程通信類 總結&#xff1a; 案例要求&#xff1a; TCP通信下,正常的寫法只能單個服務器和單個客戶端進行通信&a…

electron:vue3+vite打包案例

1、安裝electron 首先設置鏡像源&#xff0c;否則安裝會非常非常慢。 打開npm的配置文件。 npm config edit 修改配置項。 registryhttps://registry.npmmirror.com electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttp…