基於Calcite製作分庫分表中介軟體 功能場景

2021-10-12 17:04:30 字數 1408 閱讀 4293

使用calcite製作分庫分表中介軟體,在實現功能的過程中,存在著幾種用途,總得來說,有三種.

例子1觀察此sql

update person set firstname = 'fred' where lastname = 'wilson'
calcite會把它編譯成類似下面的關係表示式

logicaltablemodify

logicalfilter

logicalproject

logicaltablescan

我們僅僅需要分析logicalfilter條件,就能路由此sql,並不需要calcite的執行器來執行

例子2

update person set firstname = 'fred' where lastname = 'wilson'  and 1=1;

insert into persons values ('gates', 'bill', 'xuanwumen 10', 'beijing',1+1);

與上述的例子不同,增加了表示式計算

logicalfilter(....,n=true)

logicalproject(....,1=1)

logicalvalues(....,true)//常量摺疊

logicalproject(....,1+1)

logicalvalues({})//空的一行

一般來說,logicalproject會包含計算的表示式,此時我們基於使用分庫分表的架構,我們可以繼續分析logicalfilter得出對應的分片,而且可以利用logicalproject編譯出表示式計算器,對sql的表示式進行化簡,計算,最終得到常量,進一步轉化為sql語法樹中的文字直接量.

所以在這個例子中,我們並沒有完全使用calcite的執行器,僅僅使用了必要的部分logicalproject的執行器.當然大部分情況下,sql可以直接發往資料庫中執行,並不需要對表示式計算,但是遇上一些特殊情況,我們就要處理它,比如按日期分片,使用now函式得出日期,我們就有必要執行now函式,得到常量值,然後進一步路由.或者函式需要引用session級別的變數,比如user(),last_lnsert_id(),這些變數在物理庫是不一致的,所以我們有必要對他們進行計算.

大部分專案都直接把calcite用作查詢器,畢竟現實條件就是如此,受到開發能力,時間限制,沒有能力編寫sql查詢編譯器也沒有能力實現完整的執行器.

他們立足於calcite支援的標準sql語法定製改造.

當我們擁有自己實現的sql編譯器,也有了自己實現的執行器.我們就可以僅僅引入calcite作為優化器.具體來說也很簡單.使用relbuilder構建出需要優化的部分relnode,然後使用優化器進行優化,求解.然後把relnode結果重新轉換為自己實現的關係表示式/執行器.

基於Calcite製作分庫分表中介軟體 方案3

上次提到模版結合新自定義關係表示式來實現有效的sql生成,那麼我們可不可以像方案1中借鑑calcite現成的功能來實現對之前的方案進行改進.答案是有的 直觀的改進方法有三種 目錄 基於calcite製作分庫分表中介軟體 方案3 表函式法 規則下推 自定義關係表示式 自定義關係表示式 自定義生成執行器...

基於MySQL分庫分表方案簡介

1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...

基於MySQL分庫分表方案簡介

1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...