多表 Join 查詢能力
在構(gòu)建實(shí)時(shí)數(shù)據(jù)分析的場景中,我們常在數(shù)據(jù)加工的過程中,將多張表通過一些關(guān)聯(lián)字段打平成一張寬表,通過一張表對(duì)外提供分析能力,即大寬表模型。其實(shí)大寬表依然有它的局限性,一是,生成每一張大寬表都需要數(shù)據(jù)開發(fā)人員不小的工作量,而且生成過程也需要一定的時(shí)間;二是,生成寬表會(huì)產(chǎn)生大量的數(shù)據(jù)冗余。
?
針對(duì)寬表模型的局限性,我們從 0 到 1 自研實(shí)現(xiàn)了查詢優(yōu)化器,非常好的支持復(fù)雜查詢的需求,有如下特性:
兼容兩種 SQL 語法,支持 ANSI SQL 和原生 CLICKHOUSE SQL ;
支持基于 RBO 優(yōu)化能力,即支持:列裁剪、分區(qū)裁剪、表達(dá)式簡化、子查詢解關(guān)聯(lián)、謂詞下推、冗余算子消除、Outer-JOIN 轉(zhuǎn) INNER-JOIN、算子下推存儲(chǔ)、分布式算子拆分等常見的啟發(fā)式優(yōu)化能力;
支持基于 CBO 優(yōu)化能力,基于 Cascade 搜索框架,實(shí)現(xiàn)了高效的 Join 枚舉算法,以及基于 Histogram 的代價(jià)估算,對(duì) 10 表全連接級(jí)別規(guī)模的 Join Reorder 問題,能夠全量枚舉并尋求最優(yōu)解,同時(shí)針對(duì)大于 10 表規(guī)模的 Join Reorder 支持啟發(fā)式枚舉并尋求最優(yōu)解。CBO 支持基于規(guī)則擴(kuò)展搜索空間,除了常見的 Join Reorder 問題以外,還支持 Outer-Join/Join Reorder,Magic Set Placement 等相關(guān)優(yōu)化能力;
分布式計(jì)劃優(yōu)化,面向分布式 MPP 數(shù)據(jù)庫,生成分布式查詢計(jì)劃,并且和 CBO 結(jié)合在一起。相對(duì)業(yè)界主流實(shí)現(xiàn):分為兩個(gè)階段,首先尋求最優(yōu)的單機(jī)版計(jì)劃,然后將其分布式化。我們的方案則是將這兩個(gè)階段融合在一起,在整個(gè) CBO 尋求最優(yōu)解的過程中,會(huì)結(jié)合分布式計(jì)劃的訴求,從代價(jià)的角度選擇最優(yōu)的分布式計(jì)劃。對(duì)于 Join/Aggregate 的還支持 Partition 屬性展開。
高階優(yōu)化能力,實(shí)現(xiàn)了 Dynamic Filter pushdown、單表物化視圖改寫、基于代價(jià)的 CTE (公共表達(dá)式共享)。