基于Apache Calcite实现DSL统一查询服务。 Apache Calcite是一个动态数据管理框架。 它包含许多组成典型数据库管理系统的部分,但省略了存储原语。 它提供了行业标准的SQL解析器和验证器,具有可插入规则和成本函数的可自定义优化器,逻辑和物理代数运算符,从SQL到代数的各种转换。
dsl-client.jar(应用程序)--jdbc-->dsl-server.jar(DSL查询服务)-->mysql,mongodb
dsl-client提供两个接口验证dsl接口和原生mysql接口,参数sql需要urlencode
$ docker run -d --name mongo -p 27017:27017 mongo:4.4.12
$ docker run -d --name=mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.7
- orders.txt导入mysql(db-mysql.sql)
- customer.txt导入mysql(db-mysql.sql)
- nation.txt导入mongodb(db-mongo.sql)
$ mvn clean package -Dmaven.test.skip=true $ java -jar dsl-client.jar --spring.config.location=./application.properties $ java -jar dsl-server-jar-with-dependencies.jar -m ./dsl-model.json -s ./mongo-schema.json
Select * from db_mysql.ORDERS where O_ORDERKEY = 2 AND O_ORDERDATE >= '1996-12-01' AND O_ORDERDATE <= '1996-12-01'
Select O_ORDERKEY,count(1) as cnt
from db_mysql.ORDERS
group by O_ORDERKEY
having count(1) > 0
order by cnt limit 10
Select *
from db_mysql.ORDERS o,db_mysql.CUSTOMER c,db_mongo.NATION n
where o.O_CUSTKEY = c.C_CUSTKEY and c.C_NATIONKEY = n.N_NATIONKEY and c.C_NAME = 'Customer#000000002'
Select C_NAME,Count(O_ORDERKEY) as cnt
From (
Select o.O_ORDERKEY,c.C_CUSTKEY,c.C_NAME
from db_mysql.ORDERS o
Left join db_mysql.CUSTOMER c
On o.O_CUSTKEY = c.C_CUSTKEY )t
Group by C_NAME
Having Count(O_ORDERKEY) > 0
order by cnt desc
limit 10
执行计划,CBO,物化视图
$ ab -n 1000 -c 100 http://127.0.0.1:8080/jdbc/avatica?sql=select%20*%20from%20ORDERS%20limit%2010
$ ab -n 1000 -c 100 http://127.0.0.1:8080/jdbc/mysql?sql=select%20*%20from%20ORDERS%20limit%2010