最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Databend SQL Planner 全新設(shè)計(jì)

2022-06-22 11:56 作者:Databend  | 我要投稿

前言

為了支持復(fù)雜的 SQL 查詢,并且提供更好的使用體驗(yàn),我們?cè)谧罱膸讉€(gè)月里對(duì) Databend 的 SQL planner 進(jìn)行了大規(guī)模的重構(gòu)。目前重構(gòu)已經(jīng)接近尾聲,感興趣的朋友可以通過(guò)修改

來(lái)啟用新 planner 進(jìn)行搶先體驗(yàn)。


功能亮點(diǎn)

更加友好的查詢體驗(yàn)

無(wú)論是數(shù)據(jù)分析師還是開(kāi)發(fā)人員,在編寫 SQL 查詢的時(shí)候總會(huì)遇到各種各樣的報(bào)錯(cuò)。尤其是在 SQL 查詢較為復(fù)雜的情況下,排查報(bào)錯(cuò)成了許多人的噩夢(mèng)(筆者本人曾經(jīng)修改過(guò)有數(shù)十個(gè) JOIN 子句的 MySQL 查詢,從此對(duì) MySQL 的錯(cuò)誤提示深惡痛絕)。

為了改善這方面的用戶體驗(yàn),我們?cè)谛碌?Planner 中引入了嚴(yán)格的語(yǔ)義檢查環(huán)節(jié),使得大部分的錯(cuò)誤可以在查詢編譯階段就被攔截。同時(shí)為了方便用戶定位錯(cuò)誤的位置,我們也引入了全新的錯(cuò)誤提示算法。

當(dāng)你的 SQL 查詢使用了錯(cuò)誤的語(yǔ)法時(shí)(比如寫錯(cuò)了關(guān)鍵字,或者遺漏了某些子句),Databend 會(huì)為你提供提示信息:

當(dāng)你的 SQL 查詢出現(xiàn)語(yǔ)義上的錯(cuò)誤時(shí)(比如使用了不存在的 Column,或者 Column 具有歧義),Databend 也會(huì)為你指出錯(cuò)誤出現(xiàn)的位置:

在編寫復(fù)雜查詢時(shí),依然可以獲得較好的體驗(yàn):

支持 JOIN 查詢與關(guān)聯(lián)子查詢

在新的 SQL planner 中,我們支持了 JOIN 查詢(INNER JOIN,OUTER JOIN,CROSS JOIN)與關(guān)聯(lián)子查詢,并且提供了 Hash Join 算法用以執(zhí)行 JOIN 查詢。

JOIN 查詢的相關(guān)文檔已經(jīng)發(fā)布在 https://databend.rs/doc/reference/sql/query-syntax/dml-join,你可以查閱文檔以了解 Databend 中 JOIN 查詢的使用方式。

在 OLAP 查詢中,JOIN 是非常重要的一部分。在傳統(tǒng)的星型模型和雪花模型中,我們都需要通過(guò) JOIN 查詢將維度表與事實(shí)表連接起來(lái)以生成結(jié)果報(bào)表。

TPCH Benchmark 是由 TPC 委員會(huì)制定的一套 OLAP 查詢基準(zhǔn)測(cè)試標(biāo)準(zhǔn),用于評(píng)測(cè)數(shù)據(jù)庫(kù)系統(tǒng)的 OLAP 能力。其中包含了 8 張表,分別是:

  • Lineitem:產(chǎn)品項(xiàng)目

  • Orders:訂單信息

  • Customer:顧客信息

  • Part:零部件信息

  • Supplier:供應(yīng)商信息

  • Partsupp:零件與供應(yīng)商的關(guān)系表

  • Nation:國(guó)家信息

  • Region:地區(qū)信息

TPCH 中有 22 條復(fù)雜的查詢,對(duì)應(yīng)不同的商業(yè)需求。這里以 Q9 查詢?yōu)槔?,它的用途是?jì)算指定年度和地區(qū)的利潤(rùn)額,其中包含了大量的 JOIN 計(jì)算。在新的 Planner 中,我們已經(jīng)可以支持該查詢:

關(guān)聯(lián)子查詢同樣也是 SQL 中的重要組成部分,通過(guò)關(guān)聯(lián)子查詢可以輕松表示復(fù)雜的查詢邏輯。TPCH 的 Q4 就是一個(gè)例子,它的用途是計(jì)算一段時(shí)間內(nèi)各優(yōu)先級(jí)的訂單的交付情況。其中使用了 EXISTS 關(guān)聯(lián)子查詢來(lái)篩選逾期收貨的訂單:

目前 Databend 僅支持了關(guān)聯(lián)子查詢的簡(jiǎn)單執(zhí)行,相關(guān)的查詢優(yōu)化工作仍在進(jìn)行中,敬請(qǐng)期待。


全新架構(gòu)

新的 SQL planner 中我們對(duì) SQL 解析的流程進(jìn)行了重新設(shè)計(jì),以支撐更加復(fù)雜的語(yǔ)義分析和 SQL 優(yōu)化。在新的 SQL planner 中,一條 SQL 語(yǔ)句通過(guò)客戶端發(fā)送到 databend-query server 后,會(huì)按照下圖所示的順序由不同的組件進(jìn)行處理,最終將查詢的結(jié)果返回給客戶端:


收到 SQL 查詢后,Parser 組件會(huì)對(duì)其進(jìn)行解析。在此步驟中如果遇到了語(yǔ)法錯(cuò)誤則會(huì)直接將錯(cuò)誤信息返回給客戶端,解析成功則會(huì)生成查詢對(duì)應(yīng)的 AST(抽象語(yǔ)法樹)。


Parser

為了提供更豐富的語(yǔ)法分析功能和更好的開(kāi)發(fā)體驗(yàn),我們開(kāi)發(fā)了一套基于?nom?Parser combinator 的 DSL (領(lǐng)域特定語(yǔ)言)?nom-rule,并基于該框架重新編寫了 SQL Parser。

在這套框架下我們可以非常輕松地定義一條 Statement 的語(yǔ)法,以 CREATE TABLE 語(yǔ)句為例,我們可以使用 DSL 將其簡(jiǎn)單描述為:

優(yōu)雅的語(yǔ)法大大提高了編寫 Parser 的樂(lè)趣,歡迎有興趣的朋友們進(jìn)行嘗試。


Binder

由 Parser 成功解析出 AST 后,我們會(huì)通過(guò) Binder 對(duì)其進(jìn)行語(yǔ)義分析,并且生成一個(gè)初始的 Logical Plan(邏輯計(jì)劃)。在此過(guò)程中,我們會(huì)進(jìn)行不同類型的語(yǔ)義分析:

  • Name resolution:通過(guò)查詢 Databend Catalog 中相關(guān)的 Table, Column 對(duì)象信息,來(lái)檢查 SQL 查詢中引用的變量的合法性。并將合法的變量與對(duì)應(yīng)的對(duì)象進(jìn)行綁定,以進(jìn)行后續(xù)的分析。

  • Type check:根據(jù) name resolution 中拿到的信息,對(duì)表達(dá)式的合法性進(jìn)行檢查,并且為表達(dá)式尋找合適的返回類型。

  • Subquery unnesting:將表達(dá)式中的子查詢提取出來(lái),翻譯成關(guān)系代數(shù)的形式

  • Grouping check: 對(duì)于含有聚合計(jì)算的查詢,分析是否在聚合函數(shù)以外引用了非聚合列

通過(guò)語(yǔ)義分析,我們可以排除掉絕大多數(shù)的語(yǔ)義錯(cuò)誤,并在編譯階段將其返回給用戶,以提供最佳的錯(cuò)誤排查體驗(yàn)。


Optimizer

得到初始的 Logical Plan 后,優(yōu)化器會(huì)對(duì)其進(jìn)行改寫和優(yōu)化,最終生成一個(gè)可執(zhí)行的 Physical Plan 。

在新的 Planner 中,我們引入了一套基于 Transformation Rule 的優(yōu)化器框架(Volcano/Cascades)。通過(guò)定義一個(gè)關(guān)系代數(shù)子樹結(jié)構(gòu)的 Pattern 以及相關(guān)的 Transform 邏輯,即可實(shí)現(xiàn)一個(gè)獨(dú)立的 Rule。

以簡(jiǎn)單的 Predicate Push Down 為例:

我們只需要定義輸入的 Plan 的 Pattern:

并且實(shí)現(xiàn)一個(gè)進(jìn)行轉(zhuǎn)換的函數(shù):

Interpreter

通過(guò) Optimizer 生成 Physical Plan 后,我們會(huì)將其翻譯成可執(zhí)行的 Pipeline,并交由 Databend 的 Processor 執(zhí)行框架進(jìn)行計(jì)算。至此 Planner 的工作就告一段落,相信讀者也對(duì)新 Planner 的架構(gòu)有了一個(gè)初步的了解。更多的技術(shù)細(xì)節(jié)請(qǐng)關(guān)注我們的后續(xù)文章。


未來(lái)規(guī)劃

從頭構(gòu)建一個(gè) SQL Planner 是一件十分具有挑戰(zhàn)性的事情,但是通過(guò)重新的設(shè)計(jì)和開(kāi)發(fā),我們可以找到最適合系統(tǒng)本身的架構(gòu)與功能。在未來(lái)的一段時(shí)間里,我們將持續(xù)完善和鞏固新的 SQL Planner,功能方面則會(huì)注重于:
  • Cost-based Optimization(CBO, 基于代價(jià)的優(yōu)化)

  • 分布式查詢優(yōu)化

  • 更多的優(yōu)化規(guī)則

目前,新的 SQL planner 的遷移工作已經(jīng)接近尾聲,你可以通過(guò)該?issue?追蹤進(jìn)度。預(yù)計(jì)在七月份內(nèi)所有的遷移工作將會(huì)完成, 屆時(shí)我們將會(huì)發(fā)布版本更新的公告,敬請(qǐng)期待。

關(guān)于 Databend關(guān)于 DatabendDatabend 是一款開(kāi)源、彈性、低成本,基于對(duì)象存儲(chǔ)也可以做實(shí)時(shí)分析的新式數(shù)倉(cāng)。期待您的關(guān)注,一起探索云原生數(shù)倉(cāng)解決方案,打造新一代開(kāi)源 Data Cloud。

  • Databend 文檔:https://databend.rs/

  • twitter:https://twitter.com/Datafuse_Labs

  • Slack:https://datafusecloud.slack.com/

  • Wechat:Databend

  • GitHub :https://github.com/datafuselabs/databend

文章首發(fā)于公眾號(hào):Databend


Databend SQL Planner 全新設(shè)計(jì)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
凤翔县| 乌兰察布市| 华安县| 镇沅| 永寿县| 翁牛特旗| 荆州市| 建瓯市| 松阳县| 磴口县| 岢岚县| 榆树市| 彭山县| 荃湾区| 涪陵区| 双流县| 灌阳县| 方正县| 成武县| 通州区| 竹北市| 阿拉善盟| 清新县| 沙洋县| 清河县| 新源县| 海丰县| 苍南县| 鹤庆县| 新丰县| 阜新| 全南县| 赤水市| 永城市| 墨竹工卡县| 绥滨县| 四子王旗| 石柱| 玛纳斯县| 九台市| 屏山县|