上次提到模版結合新自定義關係表示式來實現有效的sql生成,那麼我們可不可以像方案1中借鑑calcite現成的功能來實現對之前的方案進行改進.
答案是有的
直觀的改進方法有三種
目錄
基於calcite製作分庫分表中介軟體(方案3)
表函式法
規則下推+自定義關係表示式
自定義關係表示式+自定義生成執行器實現
org.apache.calcite.rel.core.tablefunctionscan
實際上分庫分表的邏輯表可以表述為
形式1:分片函式_表名(單分片值),分片函式_表名(範圍分片值)
形式2:分片函式(表名,分片值),分片函式(表名,範圍分片值)
分片函式=分片鍵(拆分鍵)+演算法
而分片分表的謂詞分析就是為了提取分片值
邏輯表本身就自帶了分片函式資訊
所以,直接提取分片值.對邏輯表的分片函式進行賦值,就可以得到對應的物理表範圍.
select * from table where id = 1;//table是邏輯表
=>
select * from table(1) where id = 1;
=>
select * from table_0 where id = 1;//table_0是物理表
其中table帶有了分片演算法的資訊,這樣就完成了分割槽剪裁
在使用tablefunctionscan的情況下,可以參考的下推規則是
org.apache.calcite.rel.rules.filtertablefunctiontransposerule
view的設計與它是相同,把更多操作放到tablefunctionscan下面,即葉子節點以下.
tablefunctionscan
filter
relnode
該方案可以很方便生成以下模板,也可以在生成relnode,sqlnode的時候把邏輯表名字替換為tablefunctionscan,達到相同效果.
select * from table where condition
=>
select * from table_0 where condition
select * from table_1 where condition
select * from table_2 where condition
也支援使用表函式直接給與分片範圍
select * from tablefunction(range,1,10)
當分片函式相同的時候,可以認為它們的物理表的儲存分布是相同的,物理表名生成規則也是相同的,在涉及多個相同分片函式的邏輯錶帶等價關聯操作,可以直接把他們的運算下放到儲存節點運算.往後的教程我會更詳細介紹這個技術.
本質上表函式能做的事情很多,它可以返回結果集,類似支援賦參的view(但不是返回view)
org.apache.calcite.interpreter.bindables.bindabletablescan
bindabletablescan也是一種view,它演示了project,filter的下推,是bindalbe執行器家族的稍微特殊的物理關係表示式
project
filter
------------------------------------
project
tablescan
------------------------------------
tablescan
它本質上也是一種窮舉所有關係表示式形態的策略來實現匹配,然後使用列舉所有可以合拼多個關係表示式的特殊節點替換原關係表示式,然後應用規則,然後通過定義的**完成sql生成或者執行.
org.apache.calcite.adapter.jdbc.jdbcimplementor
public class jdbcimplementor extends reltosqlconverter
// checkstyle: ignore 1
/** @see #dispatch */
public result visit(jdbctablescan scan)
public result implement(relnode node)
}
在reltosqlconverter 幫助下我們可以完成對relnode生成sql,在特定的遍歷順序下,我們通過重寫階段生成函式,結合自定義的關係表示式,完成sql的準確生成.這階段實際上是在生成執行器的時候進行的. 基於Calcite製作分庫分表中介軟體 功能場景
使用calcite製作分庫分表中介軟體,在實現功能的過程中,存在著幾種用途,總得來說,有三種.例子1觀察此sql update person set firstname fred where lastname wilson calcite會把它編譯成類似下面的關係表示式 logicaltablemo...
基於MySQL分庫分表方案簡介
1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...
基於MySQL分庫分表方案簡介
1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...