calcite 学习

Target

  • 说清楚 calcite 是什么,能做什么
  • 画出 calcite 的大体架构
  • 明白 calcite 是如何跟 SS 整合的
  • 未来 SS 还可以在哪些方面进一步利用 calcite
  • calcite 优化逻辑源码级理解
  • 在 calcite 上提交 pr

Process

calcite 是什么,能做什么

calcite 是动态数据的管理框架。我理解,就是数据库的计算层,去除掉了存储的部分。 calcite 可以接入任何形式的数据,只需要我们将数据注册成表的形式,那么就可以使用 SQL 来对它进行查询。

calcite 的大体架构

calcite 如何跟 SS 整合

ShardingSphere 可以支持分库分表,所以也自然会有跨实例查询的 SQL。 例如跨实例的 join。这些 SQL 是没办法直接下推到数据库去执行的,因此利用 calcite 来实现复杂子查询或者是跨实例 join。 我们可以从一个跨实例 join 的 select debug 来查看整合 calcite 的方式。 1. 执行查询前,会先构造 OptimizerContext,里面包含一些数据库的配置,例如 caseSensitive -> false conformance -> MYSQL_5 timeZone -> UTC lex -> MYSQL fun -> mysql 以及一些默认的规则 HepPlanner

Polardb-x 的 join 实现

文档信息提取

https://developer.aliyun.com/article/783392 本文首先介绍了 MySQL 的 join 实现,包括以下方式

  • Nested-Loop Join (NL Join)
  • Batched Key Access Join (BKA Join)
  • Block Nested-Loop Join(版本 < 8.0.20)
  • Hash Join (版本 >= 8.0.18)

polardb-x 支持多种 join 方式,包括 Lookup Join、Nested-Loop Join、Hash Join、Sort-Merge Join 等,本文主要讲的是 Lookup Join

lookup join

Lookup Join 的执行过程如下(非索引回表情形):

分布式 join 调研

分布式 join 调研

Citus Data

Citus Data 是一个开源的分布式数据库管理系统,它是基于 PostgreSQL 架构之上,能够允许数据库在多个服务器之间进行分布式运算,以便应对大型数据处理和高流量负载的需求。利用 Citus Data 可以为 PostgreSQL 提供横向扩展的能力,使其可以更好地应对应用中的大量数据请求,具有较高的性能和可扩展性。Citus Data 的特点还包括良好的可用性、容错性、可管理性和可扩展性。Citrus Data 可以作为云端数据库的解决方案提供,同时也适用于在本地运行的企业数据库和分析场景中。

分布式 join 支持方式(数据复制)

单表 join 分表

下图介绍了 单表和 sharding 表 join 时 citus 的处理方式

它两种方式来对 local 表和 distributed 表进行关联查询

  • 将 distributed 表的数据从 workers 节点移动到协调器
  • 将 local 表数据从协调器移动到 workers 节点

两种方式的选择有多种模式可以配置,例如自动模式: 因为一般来说 distributed 表的数据量比较大,所以只有当满足以下条件时才会将数据从 distributed 移动到 local 中