Apache Calcite VolcanoPlanner优化过程解析

VolcanoPlanner是calcite自带的基于代价的优化器。在优化过程中,会计算优化规则生成的等价关系表达式的计算代价,通过动态规划算法找出整个最优的执行计划。

以下分析基于calcite1.26.0版本源码

使用VolcanoPlanner

这里以一个单元测试为例子解释如何使用calcite的VolcanoPlanner。

  @Test
  void myTest() {
   
    ConnectionSpec SCOTT = CalciteAssert.DatabaseInstance.HSQLDB.scott;
    SchemaPlus rootSchema = Frameworks.createRootSchema(true);
    Map<String, Object> map = new HashMap<>();
    map.put("jdbcDriver", SCOTT.driver);
    map.put("jdbcUser", SCOTT.username);
    map.put("jdbcPassword", SCOTT.password);
    map.put("jdbcUrl", SCOTT.url);
    map.put("jdbcCatalog", SCOTT.catalog);
    map.put("jdbcSchema", SCOTT.schema);
    JdbcSchema schema = JdbcSchema.create(rootSchema, "JDBC_SCOTT", map);
    rootSchema = rootSchema.add("  JDBC_SCOTT", schema);
    FrameworkConfig config = Frameworks.newConfigBuilder()
        .defaultSchema(rootSchema)
        .parserConfig(SqlParser.Config.DEFAULT)
        .programs(Programs.standard()).build();


    RelBuilder relBuilder = RelBuilder.create(config);
    RelNode relNode = relBuilder.scan("EMP")
        .project(relBuilder.field("DEPTNO"), relBuilder.field("ENAME"))
        .sort(relBuilder.field("DEPTNO")).build();

    VolcanoPlanner planner = (VolcanoPlanner) relNode.getCluster().getPlanner();
    //获取期望的RelTraiset,这里是将Convention.None替换成EnumerableConvention
    RelTraitSet desired = relNode.getTraitSet().replace(EnumerableConvention.INSTANCE).simplify();
    //设置根节点,会从根节点开始迭代将所有子节点也注册到planner中
    planner.setRoot(planner.changeTraits(relNode, desired));
    RelNode result = planner.
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值