??一個(gè)schema adapter允許Calcite去讀取特定類型的數(shù)據(jù),將這些數(shù)據(jù)以一種table格式schema展示出來。
? Cassandra adapter (calcite-cassandra)
? CSV adapter (example/csv)
? Druid adapter (calcite-druid)
? Elasticsearch adapter(calcite-elasticsearch3 and calcite-elasticsearch6)
? File adapter (calcite-file)
? JDBC adapter (part of calcite-core)
? MongoDB adapter (calcite-mongodb)
? OS adapter (calcite-os)
? Pig adapter (calcite-pig)
? Solr cloud adapter (solr-sql)
? Spark adapter (calcite-spark)
? Splunk adapter (calcite-splunk)
? Eclipse Memory Analyzer (MAT) adapter (mat-calcite-plugin)
創(chuàng)新互聯(lián)建站是專業(yè)的石河子網(wǎng)站建設(shè)公司,石河子接單;提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行石河子網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
? Piglet (calcite-piglet) runs queries in a subset of Pig Latin
??許多項(xiàng)目和產(chǎn)品使用Apache Calcite進(jìn)行SQL解析,查詢優(yōu)化,數(shù)據(jù)虛擬化/聯(lián)邦以及物化視圖重寫。其中一些在“powered by Calcite”頁面。
??驅(qū)動(dòng)程序允許您從應(yīng)用程序連接到Calcite。
? JDBC Driver(Java Doc)
?JDBC驅(qū)動(dòng)程序由Avatica提供 支持。連接可以是本地或遠(yuǎn)程的(HTTP上的JSON或HTTP上的Protobuf)。
JDBC連接字符串參數(shù)
屬性 | 描述 |
---|---|
approximateDecimal | 是否可以接受DECIMAL類型上的聚合函數(shù)的近似結(jié)果 |
approximateDistinctCount | 是否可以接受聚合函數(shù)COUNT(DISTINCT …)的近似結(jié)果 |
approximateTopN | 是否可以接受”TopN”查詢(ORDER BY aggFun() DESC LIMIT n)的近似結(jié)果 |
caseSensitive | 標(biāo)識符是否區(qū)分大小寫。如果未指定,則使用來自于lex的值。 |
conformance | SQL一致性級別。值:DEFAULT(默認(rèn),類似于PRAGMATIC_2003),LENIENT,MySQL_5,ORACLE_10,ORACLE_12,PRAGMATIC_99,PRAGMATIC_2003,STRICT_92,STRICT_99,STRICT_2003,SQL_SERVER_2008。 |
createMaterializations | Calcite是否創(chuàng)建物化的東西。默認(rèn)false |
defaultNullCollation | 如果在查詢中既不指定NULLS FIRST也不指定NULLS LAST,應(yīng)如何對NULL值進(jìn)行排序。缺省值為HIGH,與Oracle相同,對NULL值進(jìn)行排序。 |
druidFetch | 執(zhí)行一次SELECT查詢時(shí),Druid適配器應(yīng)該讀取多少行。 |
forceDecorrelate | 計(jì)劃器是否應(yīng)該盡可能地相互關(guān)聯(lián)。默認(rèn)為true。 |
fun | 內(nèi)置函數(shù)和運(yùn)算符的集合。有效值是“標(biāo)準(zhǔn)”(默認(rèn)),“oracle”,“空間”,并可以使用逗號連接組合,例如“oracle,spatial”。 |
lex | 詞匯(關(guān)鍵字)策略。值是ORACLE(默認(rèn)),MYSQL,MYSQL_ANSI,SQL_SERVER,JAVA。 |
materializationsEnabled | Calcite是否使用物化的東西。默認(rèn)false |
model | JSON模型文件的URI |
parserFactory | 解析器工廠。實(shí)現(xiàn)SqlParserImplFactory 接口的類的名稱,并且有一個(gè)公有的默認(rèn)構(gòu)造方法或者INSTANCE常量 |
quoting | 如何引用標(biāo)識符。值是DOUBLE_QUOTE,BACK_QUOTE,BRACKET。如果未指定,則使用來自于lex的值。 |
quotedCasing | 如何存儲使用了引號的標(biāo)識符。值是UNCHANGED, TO_UPPER, TO_LOWER。如果未指定,則使用來自于lex的值。 |
schema | 初始化schema名稱 |
schemaFactory | Schema工廠。實(shí)現(xiàn)SchemaFactory接口的類的名稱,并且有一個(gè)公有的默認(rèn)構(gòu)造方法或者INSTANCE常量。如果指定了model,此屬性會被忽略。 |
schemaType | Schema類型。值必須是“MAP”(默認(rèn)值),“JDBC”或“CUSTOM”。(如果schemaFactory指定則隱式指定為CUSTOM類型)如果指定了model,此屬性會被忽略。 |
spark | 指定是否應(yīng)將Spark用作無法推送到源系統(tǒng)的處理引擎。如果為false(默認(rèn)值),則Calcite將生成實(shí)現(xiàn)了Enumerable接口的代碼。 |
timeZone | 時(shí)區(qū),例如“gmt-3”。默認(rèn)是JVM的時(shí)區(qū)。 |
typeSystem | 類型系統(tǒng)。實(shí)現(xiàn)了接口RelDataTypeSystem的類的名稱,并具有公有的默認(rèn)構(gòu)造函數(shù)或INSTANCE常量。 |
unquotedCasing | 如果標(biāo)識符未被引用,如何存儲。有效值是UNCHANGED,TO_UPPER,TO_LOWER。如果未指定,則使用來自于lex的值。 |
??如果僅僅連接到一個(gè)基于內(nèi)置shema類型的模型,不需要指定model。例如:
jdbc:calcite:schemaType=JDBC; schema.jdbcUser=SCOTT; schema.jdbcPassword=TIGER; schema.jdbcUrl=jdbc:hsqldb:res:foodmart
??通過JDBC Schema適配器創(chuàng)建一個(gè)映射到foodmart數(shù)據(jù)庫的連接。
?相似的,可以連接到基于用戶定義的schema適配器的單一schema。例如:
jdbc:calcite:schemaFactory=org.apache.calcite.adapter.cassandra.CassandraSchemaFactory; schema.host=localhost; schema.keyspace=twissandra
??創(chuàng)建一個(gè)連接到Cassandra適配器連接,與如下的模型文件等效:
{
"version": "1.0",
"defaultSchema": "foodmart",
"schemas": [
{
type: 'custom',
name: 'twissandra',
factory: 'org.apache.calcite.adapter.cassandra.CassandraSchemaFactory',
operand: {
host: 'localhost',
keyspace: 'twissandra'
}
}
]
}
注意:
?operand部分的每個(gè)key,在連接字符串都以shema.為前綴。
??Calcite的核心模塊(calcite-core)支持SQL查詢(SELECT)和DML操作(INSERT,UPDATE,DELETE,MERGE),但不支持DDL操作,如CREATE SCHEMA或CREATE TABLE。正如我們將要看到的,DDL使存儲庫的狀態(tài)模型變得復(fù)雜,并且使得解析器更難以擴(kuò)展,因此我們將DDL留在了核心之外。
?服務(wù)器模塊(calcite-server)向Calcite添加DDL支持。它擴(kuò)展了SQL解析器,使用與子項(xiàng)目相同的機(jī)制,添加了一些DDL命令:
$ ./sqlline
sqlline version 1.3.0
> !connect jdbc:calcite:parserFactory=org.apache.calcite.sql.parser.ddl.SqlDdlParserImpl#FACTORY sa ""
> CREATE TABLE t (i INTEGER, j VARCHAR(10));
No rows affected (0.293 seconds)
> INSERT INTO t VALUES (1, 'a'), (2, 'bc');
2 rows affected (0.873 seconds)
> CREATE VIEW v AS SELECT * FROM t WHERE i > 1;
No rows affected (0.072 seconds)
> SELECT count(*) FROM v;
+---------------------+
| EXPR$0 |
+---------------------+
| 1 |
+---------------------+
1 row selected (0.148 seconds)
> !quit
Linux系統(tǒng)測試通過,Windows尚不支持。
?calcite-server模塊是可選的。其目標(biāo)之一是使用簡潔的示例來展示Calcite的功能(例如物化視圖,外部表和生成列),可以從SQL命令行嘗試這些示例。所有calcite-server使用的功能都可以通過calcite-core中的API。
?如果您是子項(xiàng)目的作者,那么您的語法擴(kuò)展名不太可能與calcite-server匹配,所以我們建議您通過擴(kuò)展核心解析器來添加SQL語法擴(kuò)展; 如果您需要DDL命令,則可以將calcite-server 復(fù)制粘貼到您的項(xiàng)目中。
?目前,存儲庫不會被持久化。在執(zhí)行DDL命令時(shí),通過從根Schema添加和刪除可訪問的對象來修改內(nèi)存中的存儲庫 。同一SQL會話中的所有命令都將看到這些對象。您可以通過執(zhí)行相同的SQL命令腳本,在將來的會話中創(chuàng)建相同的對象。
?Calcite也可以作為數(shù)據(jù)虛擬化或聯(lián)邦服務(wù)器:Calcite管理多個(gè)外部Schema中的數(shù)據(jù),但是對于客戶端來說數(shù)據(jù)似乎都在同一個(gè)地方。Calcite選擇應(yīng)該在哪里處理,以及是否為了提高效率創(chuàng)建數(shù)據(jù)副本。calcite-server模塊是實(shí)現(xiàn)這一目標(biāo)的一個(gè)步驟; 一個(gè)行業(yè)垂直的解決方案將需要進(jìn)一步的封裝擴(kuò)展(使Calcite作為服務(wù)可運(yùn)行),存儲庫持久性,授權(quán)和安全性。
??還有許多其他的API可以擴(kuò)展Calcite的功能。
?在本節(jié)中,我們將簡要介紹這些API,為您提供一個(gè)對可以實(shí)現(xiàn)功能的思路。要充分使用這些API,您需要閱讀其他文檔,例如接口的javadoc,并且可能需要找我們出為它們編寫的測試。
??有幾種方法可以將運(yùn)算符或函數(shù)添加到Calcite中。我們將首先描述最簡單(也是最不強(qiáng)大的)。
?用戶自定義的函數(shù)是最簡單的(但功能最少)。它們很容易編寫(你只需編寫一個(gè)Java類并將其注冊到Schema中),但是在參數(shù)的數(shù)量和類型,解析重載函數(shù)或派生返回類型方面不提供很大的靈活性。
?如果需要這種靈活性,可能需要寫一個(gè)用戶自定義的操作符 (參見SqlOperator接口)。
如果操作符不遵守標(biāo)準(zhǔn)的SQL函數(shù)語法“ f(arg1, arg2, ...)”,那么需要擴(kuò)展解析器。
在測試中有很多很好的例子:UdfTest類測試用戶自定義的函數(shù)和用戶自定義的聚合函數(shù)。
?聚合函數(shù)
?用戶自定義的聚合函數(shù)與用戶自定義的函數(shù)相似,但每個(gè)函數(shù)都有幾個(gè)對應(yīng)的Java方法,一個(gè)方法用于聚合生命周期中的每一個(gè)階段:
struct Accumulator {
final int sum;
}
Accumulator init() {
return new Accumulator(0);
}
Accumulator add(Accumulator a, int x) {
return new Accumulator(a.sum + x);
}
Accumulator merge(Accumulator a, Accumulator a2) {
return new Accumulator(a.sum + a2.sum);
}
int result(Accumulator a) {
return new Accumulator(a.sum + x);
}
下面是計(jì)算列值為4和7的兩行總和的順序調(diào)用序列:
a = init() # a = {0}
a = add(a, 4) # a = {4}
a = add(a, 7) # a = {11}
return result(a) # returns 11
窗口函數(shù)
?窗口函數(shù)與聚合函數(shù)類似,但是它應(yīng)用于由OVER子句而不是由GROUP BY子句收集的一組行。每個(gè)聚合函數(shù)都可以用作窗口函數(shù),但是有一些關(guān)鍵的區(qū)別。窗口函數(shù)看到的行可能是有序的,依賴于順序的窗口函數(shù)(RANK例如)不能用作聚合函數(shù)。
?另一個(gè)區(qū)別是,窗口是不相交的( non-disjoint):一個(gè)特定的行可以出現(xiàn)在多個(gè)窗口中。例如,10:37出現(xiàn)在9:00-10:00以及9:15-9:45兩個(gè)窗口。
?窗口函數(shù)是遞增計(jì)算的:當(dāng)時(shí)鐘從10:14轉(zhuǎn)動(dòng)到10:15時(shí),可能有兩行進(jìn)入窗口,三行離開。為此,窗口函數(shù)有一個(gè)額外的生命周期操作:
Accumulator remove(Accumulator a, int x) {
return new Accumulator(a.sum - x);
}
??下面是計(jì)算移動(dòng)總和的順序調(diào)用序列,在前兩行中,4行中的值分別為4,7,2和3:
a = init() # a = {0}
a = add(a, 4) # a = {4}
emit result(a) # emits 4
a = add(a, 7) # a = {11}
emit result(a) # emits 11
a = remove(a, 4) # a = {7}
a = add(a, 2) # a = {9}
emit result(a) # emits 9
a = remove(a, 7) # a = {2}
a = add(a, 3) # a = {5}
emit result(a) # emits 5
分組窗口函數(shù)
?分組窗口函數(shù)是操作GROUP BY子句將記錄集合在一起的函數(shù)。內(nèi)置的分組窗口函數(shù)有HOP,TUMBLE和SESSION。可以通過實(shí)現(xiàn)接口SqlGroupedWindowFunction來定義其他函數(shù) 。
表函數(shù)和table macros
?用戶自定義的表函數(shù) 的定義方式與常規(guī)的用戶自定義“標(biāo)量”函數(shù)類似,但它是在查詢的FROM子句中使用。以下查詢使用一個(gè)名為Ramp的表函數(shù):
SELECT * FROM TABLE(Ramp(3, 4))
??用戶定義的table macros使用與表函數(shù)相同的SQL語法,但定義不同。它們不會生成數(shù)據(jù),而是生成一個(gè)關(guān)系表達(dá)式。在查詢準(zhǔn)備過程中調(diào)用table macros,然后可以優(yōu)化它們生成的關(guān)系表達(dá)式。(Calcite使用table macros實(shí)現(xiàn)視圖)。
?TableFunctionTest類測試表函數(shù)并包含幾個(gè)有用的例子。
??假設(shè)你需要擴(kuò)展Calcite的SQL語法,這樣才能兼容未來語法的變化。在項(xiàng)目中復(fù)制Parser.jj語法文件的副本是愚蠢的,因?yàn)檎Z法是經(jīng)常編輯的。
?幸運(yùn)的是,Parser.jj實(shí)際上是一個(gè) Apache FreeMarker 模板,其中包含可以被替換的變量。calcite-core中的解析器使用變量的默認(rèn)值實(shí)例化模板,通常為空,但可以覆蓋。如果項(xiàng)目使用不同的解析器,可以提供自己的config.fmpp和parserImpls.ftl文件,并因此產(chǎn)生擴(kuò)展的解析器。
?calcite-server模塊是在[ CALCITE-707 ]中創(chuàng)建的,并添加了DDL語句如CREATE TABLE,這是可以參考遵循的一個(gè)示例。另外可參照類ExtensionSqlParserTest。
??要定制解析器應(yīng)該接受的SQL擴(kuò)展,請實(shí)現(xiàn) SqlConformance接口或使用枚舉SqlConformanceEnum中的某個(gè)內(nèi)置值 。
?要控制如何為外部數(shù)據(jù)庫(通常通過JDBC適配器)生成SQL,請使用SqlDialect類。方言也描述了引擎的能力,比如是否支持OFFSET和使用FETCH。
??要自定義Schema,需要實(shí)現(xiàn)SchemaFactory接口。
?在查詢準(zhǔn)備期間,Calcite會調(diào)用這個(gè)接口來找出你自定義的Schema包含的表和子Schema。在查詢中引用你自定義schema中的表時(shí),Calcite將要求你的schema創(chuàng)建Table接口的實(shí)例 。
?該表將被包裝在 TableScan中 ,并將進(jìn)行查詢優(yōu)化過程。
??反射(Reflective)schema(ReflectiveSchema類)是一種封裝Java對象的方式,以便它作為Schema出現(xiàn)。其擁有集合值的字段將顯示為表格。
?它不是一個(gè)Schema工廠,而是一個(gè)真正的模式; 必須通過調(diào)用API來創(chuàng)建對象并將其包裝在Schema中。
?請參閱ReflectiveSchemaTest類。
??要自定義一個(gè)表格,你需要實(shí)現(xiàn)TableFactory接口。盡管Schema工廠生產(chǎn)一組命名表格,但是當(dāng)綁定到具有特定名稱的Schema(以及可選的一組額外操作數(shù)operands)時(shí),表格工廠會生成單個(gè)表格。
修改數(shù)據(jù)
?如果你的自定義表格支持DML操作(INSERT,UPDATE,DELETE,MERGE),實(shí)現(xiàn)Table接口的同時(shí)也必須實(shí)現(xiàn)ModifiableTable接口。
流
?如果你的自定義表格支持流式查詢,實(shí)現(xiàn)Table接口的同時(shí)必須實(shí)現(xiàn) StreamableTable接口。
?參見 StreamTest 類的例子。
操作下推到自定義表格
?如果您希望將處理推到自定義表格的源系統(tǒng)上,請考慮實(shí)現(xiàn) FilterableTable 接口或 ProjectableFilterableTable接口。
?如果想要更多的控制,應(yīng)該寫一個(gè)計(jì)劃器的規(guī)則。這將允許您下推表達(dá)式,根據(jù)成本決定是否下推處理,是否下推更復(fù)雜的操作,如關(guān)聯(lián),聚合和排序。
??可以通過實(shí)現(xiàn)RelDataTypeSystem接口來自定義類型系統(tǒng)的某些方面。
關(guān)系運(yùn)算符
?所有關(guān)系運(yùn)算符都實(shí)現(xiàn)了RelNode接口, 并且大部分繼承自AbstractRelNode類。TableScan, TableModify, Values, ProjectFilter, Aggregate, Join, Sort, Union, Intersect, Minus, Window和 Match等核心運(yùn)算符(由 SqlToRelConverter使用 ,覆蓋了常規(guī)傳統(tǒng)的關(guān)系代數(shù)) 。
?上述每一個(gè)都有一個(gè)“純”的邏輯子類,LogicalProject 等等。任何給定的適配器都會有引擎可以有效執(zhí)行操作的對應(yīng)部分; 例如,Cassandra適配器有 CassandraProject ,但是沒有CassandraJoin。
?可以定義你自己的RelNode子類來添加一個(gè)新的操作符,或者在一個(gè)特定的引擎中實(shí)現(xiàn)一個(gè)現(xiàn)有的運(yùn)算符。
?為了使運(yùn)算符有用且功能強(qiáng)大,您需要計(jì)劃器規(guī)則將其與現(xiàn)有運(yùn)算符結(jié)合使用。(并提供元數(shù)據(jù),見下文)。這是代數(shù),效果是組合的:你寫了一些規(guī)則,但它們結(jié)合起來可以處理指數(shù)數(shù)量的查詢模式。
?如果可能的話,讓您的運(yùn)算符成為現(xiàn)有運(yùn)算符的子類; 那么可以重用或適應(yīng)其規(guī)則。更好的是,如果你的運(yùn)算符是一個(gè)邏輯操作,你可以用現(xiàn)有的運(yùn)算符來重寫(通過計(jì)劃器規(guī)則),盡量應(yīng)該這樣做。您將能夠重復(fù)使用這些運(yùn)算符的規(guī)則,元數(shù)據(jù)和實(shí)現(xiàn),而無需額外的工作。
計(jì)劃器規(guī)則
?計(jì)劃器規(guī)則(RelOptRule類)可以將關(guān)系表達(dá)式轉(zhuǎn)換為等效的關(guān)系表達(dá)式。
?計(jì)劃器引擎有許多計(jì)劃器規(guī)則注冊并觸發(fā)它們將輸入查詢轉(zhuǎn)換為更高效的計(jì)劃。因此,計(jì)劃器規(guī)則是優(yōu)化過程的核心,但令人驚訝的是每個(gè)計(jì)劃器規(guī)則并不關(guān)心成本。計(jì)劃器引擎負(fù)責(zé)按順序發(fā)射規(guī)則,產(chǎn)生最優(yōu)計(jì)劃,但是每個(gè)規(guī)則只關(guān)心它的正確性。
?Calcite有兩個(gè)內(nèi)置的計(jì)劃器引擎: VolcanoPlanner 類使用動(dòng)態(tài)編程,對窮舉搜索很有效,而 HepPlanner類則以更加固定的順序觸發(fā)一系列規(guī)則。
調(diào)用約定
?調(diào)用約定是特定數(shù)據(jù)引擎使用的協(xié)議。例如,Cassandra 引擎具有關(guān)系運(yùn)算符的集合, CassandraProject,CassandraFilter等等,并且這些操作符可以被相互連接,而無需從一個(gè)格式轉(zhuǎn)換成另一種格式的數(shù)據(jù)。
?如果需要將數(shù)據(jù)從一個(gè)調(diào)用約定轉(zhuǎn)換為另一個(gè)調(diào)用約定,則Calcite使用一個(gè)稱為轉(zhuǎn)換器的特殊關(guān)系表達(dá)式子類(參見Converter類)。但是,當(dāng)然,轉(zhuǎn)換數(shù)據(jù)需要運(yùn)行成本。
在計(jì)劃使用多個(gè)引擎的查詢時(shí),Calcite根據(jù)其調(diào)用約定對關(guān)系表達(dá)式樹的區(qū)域進(jìn)行“著色”。計(jì)劃器通過觸發(fā)規(guī)則將操作推入數(shù)據(jù)源。如果引擎不支持特定操作,則規(guī)則不會觸發(fā)。有時(shí)一個(gè)操作可能發(fā)生在多個(gè)地方,最終根據(jù)成本選擇最佳方案。
?調(diào)用約定是實(shí)現(xiàn)了Convention接口,輔助接口(例如CassandraRel接口)和RelNode類的一組子類, 用于實(shí)現(xiàn)核心關(guān)系運(yùn)算符(Project,F(xiàn)ilter, Aggregate等等)的一個(gè)類。
內(nèi)置SQL實(shí)現(xiàn)
?如果一個(gè)適配器沒有實(shí)現(xiàn)所有核心關(guān)系運(yùn)算符,Calcite如何實(shí)現(xiàn)SQL?
?答案是一個(gè)特定的內(nèi)置調(diào)用約定EnumerableConvention。可枚舉約定的關(guān)系表達(dá)式被實(shí)現(xiàn)為“內(nèi)置”:Calcite生成Java代碼,編譯并在其自己的JVM中執(zhí)行它。可枚舉約定比運(yùn)行在列式數(shù)據(jù)文件上的分布式引擎效率低,但可以實(shí)現(xiàn)所有核心關(guān)系運(yùn)算符以及所有內(nèi)置的SQL函數(shù)和運(yùn)算符。如果一個(gè)數(shù)據(jù)源不能實(shí)現(xiàn)一個(gè)關(guān)系運(yùn)算符,則枚舉約定是一個(gè)回退。
??Calcite有一個(gè)元數(shù)據(jù)系統(tǒng),允許你定義成本函數(shù)和有關(guān)關(guān)系運(yùn)算符的統(tǒng)計(jì)信息,統(tǒng)稱為元數(shù)據(jù)。每種元數(shù)據(jù)都有(通常)一種方法的接口。例如,selectivity 由RelMdSelectivity類和方法 getSelectivity(RelNode rel,RexNode predicate)定義。
?有許多內(nèi)置的元數(shù)據(jù)類型,包括collation, column origins, column uniqueness, distinct row count, distribution, explain visibility, expression lineage, max row count, node types, parallelism, percentage original rows, population size, predicates, row count, selectivity, size, table references, unique keys; 也可以自定義。
?然后,您可以提供一個(gè)元數(shù)據(jù)提供者(Provider)來計(jì)算RelNode的特定子類的元數(shù)據(jù)。元數(shù)據(jù)提供者可以處理內(nèi)置和擴(kuò)展的元數(shù)據(jù)類型,以及內(nèi)置和擴(kuò)展RelNode類型。在準(zhǔn)備查詢時(shí),Calcite將所有適用的元數(shù)據(jù)提供者組合起來,并維護(hù)一個(gè)緩存,以便只計(jì)算一次給定的元數(shù)據(jù)(例如在特定Filter運(yùn)算符中x > 10條件的selectivity )。
當(dāng)前文章:ApacheCalcite官方文檔中文版-進(jìn)階-1.適配器
文章起源:http://chinadenli.net/article46/iphjhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、微信公眾號、手機(jī)網(wǎng)站建設(shè)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)