一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

查詢優(yōu)化器有多重要

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 作者:芋道源碼 ? 2022-10-25 17:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

相信大家都對(duì)大名鼎鼎的ClickHouse有一定的了解了,它強(qiáng)大的數(shù)據(jù)分析性能讓人印象深刻。但在字節(jié)大量生產(chǎn)使用中,發(fā)現(xiàn)了ClickHouse依然存在了一定的限制。例如:

缺少完整的upsert和delete操作

多表關(guān)聯(lián)查詢能力弱

集群規(guī)模較大時(shí)可用性下降(對(duì)字節(jié)尤其如此)

沒(méi)有資源隔離能力

因此,我們決定將ClickHouse能力進(jìn)行全方位加強(qiáng),打造一款更強(qiáng)大的數(shù)據(jù)分析平臺(tái)。后面我們將從五個(gè)方面來(lái)和大家分享,此前兩篇內(nèi)容分別為大家介紹了“更新刪除”和“多表關(guān)聯(lián)查詢”,本篇將詳細(xì)介紹我們是如何構(gòu)建ClickHouse的查詢優(yōu)化器。

查詢優(yōu)化器有多重要?

在傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)中,如Oracle、DB2、MySQL,查詢優(yōu)化器都是作為幾個(gè)最重要的核心組件之一??梢哉f(shuō),沒(méi)有查詢優(yōu)化器的數(shù)據(jù)庫(kù)是不完整的。相對(duì) OLTP 而言在OLAP領(lǐng)域中更是如此;對(duì)于分析類場(chǎng)景,查詢更為復(fù)雜,計(jì)劃好壞的差異更大。一個(gè)優(yōu)秀的查詢優(yōu)化器可以防止用戶寫出不好的SQL導(dǎo)致執(zhí)行速度慢,能夠準(zhǔn)確的選擇出一條效率最高的執(zhí)行路徑,大幅度降低查詢時(shí)間。相應(yīng)的,一個(gè)不好的查詢優(yōu)化器,甚至?xí)尣樵冏兟?/p>

常見(jiàn)的優(yōu)化器邏輯分為兩類,一類叫“基于規(guī)則的優(yōu)化(RBO)”,另一類稱為“基于代價(jià)的優(yōu)化(CBO)”,實(shí)際應(yīng)用過(guò)程中應(yīng)當(dāng)兩類兼顧才能取得最佳效果。

基于規(guī)則的優(yōu)化

根據(jù)優(yōu)化規(guī)則對(duì)關(guān)系表達(dá)式進(jìn)行轉(zhuǎn)換,這里的轉(zhuǎn)換是說(shuō)一個(gè)關(guān)系表達(dá)式經(jīng)過(guò)優(yōu)化規(guī)則后會(huì)變成另外一個(gè)關(guān)系表達(dá)式,同時(shí)原有表達(dá)式會(huì)被裁剪掉,經(jīng)過(guò)一系列轉(zhuǎn)換后生成最終的執(zhí)行計(jì)劃。RBO中包含了一套有著嚴(yán)格順序的優(yōu)化規(guī)則,同樣一條SQL,無(wú)論讀取的表中數(shù)據(jù)是怎么樣的,最后生成的執(zhí)行計(jì)劃都是一樣的。同時(shí),在RBO中SQL寫法的不同很有可能影響最終的執(zhí)行計(jì)劃,從而影響腳本性能。

基于代價(jià)的優(yōu)化

根據(jù)優(yōu)化規(guī)則對(duì)關(guān)系表達(dá)式進(jìn)行轉(zhuǎn)換,這里的轉(zhuǎn)換是說(shuō)一個(gè)關(guān)系表達(dá)式經(jīng)過(guò)優(yōu)化規(guī)則后會(huì)生成另外一個(gè)關(guān)系表達(dá)式,同時(shí)原有表達(dá)式也會(huì)保留,經(jīng)過(guò)一系列轉(zhuǎn)換后會(huì)生成多個(gè)執(zhí)行計(jì)劃,然后CBO會(huì)根據(jù)統(tǒng)計(jì)信息和代價(jià)模型(Cost Model)計(jì)算每個(gè)執(zhí)行計(jì)劃的Cost,從中挑選Cost最小的執(zhí)行計(jì)劃。

ByteHouse的查詢優(yōu)化器

目前主流的OLAP的引擎在查詢優(yōu)化器方面做的并不夠好,尤其是ClickHouse。眾所周知ClickHouse以快著稱,但是它的快是采用了力大飛磚的方式,需要用戶將數(shù)據(jù)預(yù)先生成大寬表,以避免過(guò)于復(fù)雜的多表查詢從而獲得高性能。而代價(jià)是,每次維度變化或新需求都需要大量操作,以及在必須使用多表關(guān)聯(lián)進(jìn)行分析的場(chǎng)景中顯得十分無(wú)力。

作為一個(gè)企業(yè)級(jí)的OLAP數(shù)據(jù)庫(kù)來(lái)說(shuō)一個(gè)完善且強(qiáng)大的優(yōu)化器是必不可少的,因此,ByteHouse從零開(kāi)始自研的了查詢優(yōu)化器。

ec758896-5341-11ed-a3b6-dac502259ad0.png

查詢優(yōu)化的完整流程

上圖描述了整個(gè)查詢的執(zhí)行流程,從 SQL parse 到執(zhí)行期間所有內(nèi)容全部進(jìn)行了重新實(shí)現(xiàn)(其中紫色模塊),構(gòu)建了一套完整的且規(guī)范的查詢優(yōu)化器。

主要功能模塊

Analyzers

Analyzers 目錄包括兩部分功能:

一個(gè)是 QueryRewriter,一方面是通過(guò) AST 改寫的方式實(shí)現(xiàn)一些語(yǔ)法特性;我們同時(shí)支持 Clickhouse SQL 和標(biāo)準(zhǔn) SQL,所以另一方面是確保在 Clickhouse SQL 模式下 SQL 語(yǔ)義能和原生 Interpreter 執(zhí)行模式一致。

另一個(gè)是 QueryAnalyzer,用于對(duì)改寫完的 AST 進(jìn)行語(yǔ)義的分析和驗(yàn)證。Analyzer 區(qū)分 ANSI SQL 和 Clickhouse SQL 兩種模式。

QueryRewriter 針對(duì) ANSI SQL 的改寫主要有:

With CTE/view 展開(kāi);

UDF 展開(kāi);

特定函數(shù)的改寫,比如將 count(*) 改寫為 count(),將 countDistinct(...) 改寫為 uniqExact(...);

QueryRewriter 針對(duì) Clickhouse SQL 的改寫主要有:

With CTE/view 展開(kāi);

UDF 展開(kāi);

特定函數(shù)的改寫;

JoinToSubquery 展開(kāi),對(duì)應(yīng)于 Interpreter 鏈路下的 JoinToSubqueryTransformVisitor;

Qualified name 歸一化,對(duì)應(yīng)于 Interpreter 鏈路下的 TranslateQualifiedNamesVisitor;

Alias 改寫,對(duì)應(yīng)于 Interpreter 鏈路下的 QueryNormalizer;

QueryAnalyzer 查詢語(yǔ)義進(jìn)行分析和校驗(yàn),將 AST 抽象成出結(jié)構(gòu)化的數(shù)據(jù)結(jié)構(gòu),為下一步構(gòu)建 plan 提供數(shù)據(jù)。在該模塊中標(biāo)準(zhǔn) SQL 和 Clickhouse SQL 進(jìn)行了區(qū)分,一套代碼同時(shí)兼容兩種語(yǔ)義。

QueryPlan

在 Analyze 之后則是利用 Analyze 出的數(shù)據(jù)結(jié)構(gòu)構(gòu)建初始的查詢計(jì)劃。QueryPlan 是在社區(qū)的 QueryPlanStep 基礎(chǔ)上改進(jìn)而來(lái),一方面增加了序列化/反序列化方法,為了計(jì)劃下發(fā)執(zhí)行基于 QueryPlan 并非 AST 或者 SQL 文本。另一方面是對(duì)社區(qū)中不合理的 Step 進(jìn)行更改,讓每個(gè) Step 僅僅表達(dá)關(guān)系代數(shù)的語(yǔ)義而非很多執(zhí)行相關(guān)的內(nèi)容和參數(shù),而這些執(zhí)行相關(guān)的信息則是在每個(gè)執(zhí)行的 server 上構(gòu)建執(zhí)行 pipeline 時(shí)才真正進(jìn)行獲得。

Optimizer

構(gòu)建完執(zhí)行計(jì)劃后則是最為關(guān)鍵最后為核心的優(yōu)化器模塊。PlanOptimizer 類是查詢優(yōu)化的入口類,首先會(huì)基于 PlanPattern 對(duì) SQL的查詢做一次粗粒度的分類,不同復(fù)雜度的查詢使用不同的規(guī)則集合,提升效率。

優(yōu)化器不管是 RBO 還是 CBO 本質(zhì)上都是對(duì)查詢做改寫,只是改寫的思路以及改寫框架有不同的取舍。我們實(shí)現(xiàn)了三種改寫框架,用于處理不同的場(chǎng)景:

基于 visitor 的改寫框架:可以 Top-Down,也可以 Botton-Up 的 方式對(duì)一個(gè) QueryPlan 做改寫,它比較適合于帶有上下文依賴的優(yōu)化規(guī)則,例如 PredicatePushDown,需要把 Predicate 一層層的往下推。

基于 pattern-match 的改寫框架:這種適合簡(jiǎn)單、通用的改寫規(guī)則,例如對(duì)于兩個(gè)連續(xù)的 Filter 做合并的動(dòng)作,只要 QueryPlan 里面的 Sub Plan 符合 Filter-Filter 這樣的 pattern,就可以 match 對(duì)應(yīng)的優(yōu)化規(guī)則,進(jìn)行改寫。

基于 Cascade 的改寫框架:通過(guò)遍歷等價(jià)計(jì)劃,并將所有的等價(jià)計(jì)劃存儲(chǔ)在一個(gè)內(nèi)存空間中,然后評(píng)估每種等價(jià)計(jì)劃的代價(jià),進(jìn)而選擇一種最優(yōu)解。

查詢優(yōu)化器帶來(lái)了什么

在性能方面,原生Clickhouse受限于缺少查詢優(yōu)化器,對(duì)于 TPC-DS測(cè)試集的99個(gè)SQL用例僅能正常運(yùn)行很少一部分查詢,即使通過(guò)手動(dòng)改寫 SQL 也僅能成功運(yùn)行 80%的查詢。在實(shí)現(xiàn)了完善的優(yōu)化器之后可以直接運(yùn)行全部 TPC-DS 原始 SQL,改進(jìn)后的 Clickhouse 才這正可以算是可用的 OLAP 數(shù)據(jù)庫(kù)。不僅僅是可以正常執(zhí)行這些復(fù)雜查詢,而且效率也得到了很大的提升,相對(duì)在沒(méi)優(yōu)化器的情況下手動(dòng)改寫的 SQL ,性能提升 6 倍以上。在內(nèi)部的一些業(yè)務(wù)場(chǎng)景中性能也有近10倍的提升。

優(yōu)化器的能力方面:

RBO:支持:列裁剪、分區(qū)裁剪、表達(dá)式簡(jiǎn)化、子查詢解關(guān)聯(lián)、謂詞下推、冗余算子消除、Outer-JOIN 轉(zhuǎn) INNER-JOIN、算子下推存儲(chǔ)、分布式算子拆分等常見(jiàn)的啟發(fā)式優(yōu)化能力。

CBO:基于 Cascade 搜索框架,實(shí)現(xiàn)了高效的 Join 枚舉算法,以及基于 Histogram 的代價(jià)估算,對(duì) 10 表全連接級(jí)別規(guī)模的 Join Reorder 問(wèn)題,能夠全量枚舉并尋求最優(yōu)解,同時(shí)針對(duì)大于10表規(guī)模的 Join Reorder 支持啟發(fā)式枚舉并尋求最優(yōu)解。CBO 支持基于規(guī)則擴(kuò)展搜索空間,除了常見(jiàn)的 Join Reorder 問(wèn)題以外,還支持 Outer-Join/Join Reorder,Magic Set Placement 等相關(guān)優(yōu)化能力。

分布式計(jì)劃優(yōu)化:面向分布式MPP數(shù)據(jù)庫(kù),生成分布式查詢計(jì)劃,并且和 CBO 結(jié)合在一起。相對(duì)業(yè)界主流實(shí)現(xiàn):分為兩個(gè)階段,首先尋求最優(yōu)的單機(jī)版計(jì)劃,然后將其分布式化。我們的方案則是將這兩個(gè)階段融合在一起,在整個(gè) CBO 尋求最優(yōu)解的過(guò)程中,會(huì)結(jié)合分布式計(jì)劃的訴求,從代價(jià)的角度選擇最優(yōu)的分布式計(jì)劃。對(duì)于 Join/Aggregate 的還支持 Partition 屬性展開(kāi)。

高階優(yōu)化能力:實(shí)現(xiàn)了 Dynamic Filter pushdown、單表物化視圖改寫、基于代價(jià)的 CTE (公共表達(dá)式共享)。

下面我們用TPC-DS標(biāo)準(zhǔn)測(cè)試集,來(lái)為大家展現(xiàn)一下添加優(yōu)化器前后的差別:

在沒(méi)有優(yōu)化器時(shí),僅能完成26個(gè)SQL的查詢。而添加了優(yōu)化器后,能夠完整跑完TPC-DS的全部99個(gè)SQL,并且在此前能完成的查詢中,性能也得到了極大的提升。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4533

    瀏覽量

    87458
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64876
  • 數(shù)據(jù)分析
    +關(guān)注

    關(guān)注

    2

    文章

    1473

    瀏覽量

    35039

原文標(biāo)題:“吊打” ClickHouse,火山引擎數(shù)倉(cāng) SQL 查詢性能 10x 提升!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MySQL優(yōu)化查詢性能優(yōu)化查詢優(yōu)化的局限性與提示

    MySQL優(yōu)化三:查詢性能優(yōu)化查詢優(yōu)化的局限性與提示
    發(fā)表于 06-02 06:34

    ENOB是什么? ENOB對(duì)于選擇示波器多重要?

    ENOB是什么?ENOB說(shuō)明了什么?如何判斷ENOB的大?。縀NOB對(duì)于選擇示波器多重要?
    發(fā)表于 05-06 09:26

    何謂視頻處理?它到底多重要?

    何謂視頻處理?它到底多重要?
    發(fā)表于 06-08 06:56

    ADC參考電壓多重要?

    參考電壓的問(wèn)題。參考電壓多重要,我們得要弄清楚它在ADC轉(zhuǎn)換中扮演一個(gè)什么樣的角色,弄清楚這個(gè)問(wèn)題,我們需要從ADC的轉(zhuǎn)換原理入手,一般單片機(jī)里面ADC模塊使用的是逐次逼近型轉(zhuǎn)換,也就是通過(guò)這種
    發(fā)表于 07-05 11:04

    嵌入式架構(gòu)多重要

    嵌入式架構(gòu)多重要?要做到嵌入式應(yīng)用的代碼邏輯清晰,且避免重復(fù)的造輪子,沒(méi)有好的應(yīng)用架構(gòu)怎么行?如果沒(méi)有好的架構(gòu),移植將會(huì)是一件很痛苦的事情。如果沒(méi)有好的架構(gòu),復(fù)用是最大的難題,沒(méi)法更大限度的復(fù)用原有的代碼。接下來(lái)嵌入式ARM便和大家分享一下,嵌入式架構(gòu)那些事兒……
    發(fā)表于 07-22 06:00

    單片機(jī)中的系統(tǒng)時(shí)鐘多重要?

    一、單片機(jī)中的系統(tǒng)時(shí)鐘多重要?系統(tǒng)時(shí)鐘就好比人的心臟,芯片沒(méi)有時(shí)鐘就是一塊廢料。51單片機(jī)不需要配置時(shí)鐘,因?yàn)橐粋€(gè)時(shí)鐘管理所有的功能資源。STM32單片機(jī)低功耗的原因之一在于時(shí)鐘。每個(gè)功能資源
    發(fā)表于 07-29 09:30

    嵌入式架構(gòu)多重要

    嵌入式架構(gòu)多重要?要做到嵌入式應(yīng)用的代碼邏輯清晰,且避免重復(fù)的造輪子,沒(méi)有好的應(yīng)用架構(gòu)怎么行?如果沒(méi)有好的架構(gòu),移植將會(huì)是一件很痛苦的事情。如果沒(méi)有好的架構(gòu),復(fù)用是最大的難題,沒(méi)法更大限度的復(fù)用
    發(fā)表于 10-27 08:15

    單片機(jī)中的系統(tǒng)時(shí)鐘多重要?

    單片機(jī)中的系統(tǒng)時(shí)鐘多重要?STM32芯片的時(shí)鐘簡(jiǎn)介,時(shí)鐘從哪里來(lái)?芯片的系統(tǒng)時(shí)鐘從哪里來(lái)?系統(tǒng)時(shí)鐘如何向下分配時(shí)鐘資源?
    發(fā)表于 11-02 07:24

    基于共享執(zhí)行策略的間隔查詢優(yōu)化

    間隔查詢作為重要查詢類型,廣泛應(yīng)用在社交網(wǎng)絡(luò)、信息檢索和數(shù)據(jù)庫(kù)領(lǐng)域.為了支持高效的間隔查詢,涌現(xiàn)出多種優(yōu)化技術(shù).盡管已有方法能夠快速響應(yīng)單
    發(fā)表于 01-05 17:09 ?0次下載
    基于共享執(zhí)行策略的間隔<b class='flag-5'>查詢</b><b class='flag-5'>優(yōu)化</b>

    SQL優(yōu)化原理 - 查詢優(yōu)化綜述

    摘要:?本文主要是對(duì)數(shù)據(jù)庫(kù)查詢優(yōu)化的一個(gè)綜述,包括查詢優(yōu)化分類、
    發(fā)表于 07-24 17:38 ?418次閱讀
    SQL<b class='flag-5'>優(yōu)化</b><b class='flag-5'>器</b>原理 - <b class='flag-5'>查詢</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>器</b>綜述

    AppleID是什么 蘋果官方科普多重要

    雖然時(shí)常和Apple ID打交道,但你知道Apple ID多重要嗎?今天,蘋果官方公眾號(hào)進(jìn)行了全面科普,再也不要把自己的Apple ID借給別人了。
    的頭像 發(fā)表于 03-08 11:39 ?6051次閱讀

    優(yōu)化DBLE獨(dú)立子查詢教程

    前期開(kāi)發(fā)反饋在使用獨(dú)立子查詢時(shí),不論子查詢中結(jié)果集幾個(gè),語(yǔ)句都會(huì)卡死遲遲得不到返回結(jié)果。但是如果去掉子查詢,直接賦值查詢很快得到返回結(jié)果。
    的頭像 發(fā)表于 03-29 13:50 ?865次閱讀

    一文終結(jié)SQL子查詢優(yōu)化

    查詢(Subquery)的優(yōu)化一直以來(lái)都是 SQL 查詢優(yōu)化中的難點(diǎn)之一。關(guān)聯(lián)子查詢的基本執(zhí)行方式類似于 Nested-Loop,但是這種
    的頭像 發(fā)表于 04-28 14:19 ?1015次閱讀
    一文終結(jié)SQL子<b class='flag-5'>查詢</b><b class='flag-5'>優(yōu)化</b>

    Cascades查詢優(yōu)化基本原理分析

    優(yōu)化一般由三個(gè)組件組成:統(tǒng)計(jì)信息收集、開(kāi)銷模型、計(jì)劃列舉。 如圖 2 所示,開(kāi)銷模型使用收集到的統(tǒng)計(jì)信息以及構(gòu)造的不同開(kāi)銷公式,估計(jì)某個(gè)特定查詢計(jì)劃的成本,幫助優(yōu)化
    的頭像 發(fā)表于 12-15 09:38 ?752次閱讀
    Cascades<b class='flag-5'>查詢</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>器</b>基本原理分析

    pcb應(yīng)變測(cè)試多重要?一文了解!

    pcb應(yīng)變測(cè)試多重要?一文了解!
    的頭像 發(fā)表于 02-24 16:26 ?1491次閱讀