目录
- 分布式数据库与系统设计
- 在KtSQL中拓展一个类型的支持
- Calcite的类型系统设计思路
分布式数据库与系统设计
对数据的处理,如果需要在应用层考虑底层的分布模型及实现,就会造成应用层的复杂度上升。比如,把汽车的位置存储到分布式数据库中,并获取距离A点最近的100辆汽车,把数据库里面所有的数据取出来计算,这样的做法是不可取的。分布式数据库除应当解决数据规模带来的存储挑战外,还应该简化数据的处理模型。
在上述的例子中,把坐标转换成可以计算的数据类型,并以此类型作为检索主键,将会大大加速处理的速度。我们知道,用GEOHASH可以把多维坐标位置转换成单值并作为主键,可以获得很好的数据处理速度。
由此可见,要在大规模数据的前提下,获得良好的数据处理能力,我们需要以下元素:
- 可以把数据转换成底层系统可以处理的数值类型
- 支持对数值类型的索引,以便提升处理的速度
- 底层系统支持分布式处理的计算能力,从而获得计算能力的提升
在KtSQL中拓展一个类型的支持
KtSQL通过以下三个设计来获得良好的数据处理能力:
- 在SQL引擎层支持自定义函数,可以实现数据类型的转换
- 支持主键索引、二次索引的机制
- 通过对存储层计算下推能力的扩展,获得分布式处理能力
引擎层支持的数值类型,直接影响着下层的具体实现。下面对SQL引擎层Calcite的类型系统设计思路进行阐述,以满足将来可能需要的各种扩展。
Calcite的类型系统设计思路
Calcite支持SQL2003中定义的数值类型。KtSQL前端现采取兼容MySQL协议的方式实现,也就意味着Calcite的类型系统需要具备从MySQL类型转换到Calcite类型的能力。同时,下层存储以Binary格式进行存储,不具备类型能力,这意味着Calcite的类型系统能够进行类型转换,并且具备元数据的能力。Calcite用Java实现,如果要实现类型转换成到runtime可以处理的类型,还需具备转换到Java类型系统的能力。
Calcite使用以下类来表达类型系统:
- SqlLiteral:在解析SQL语句的过程中,用来表达类型的类。
- SqlTypeName:SQL语句中支持的类型,SQL2003标准中,列举的需要支持的类型超过了Java语言中定义的SQL基础类型。
- SqlTypeFamily:SqlType类型分类的枚举,定义了支持的类型分类。支持JdbcType里面的类型与SqlType进行相互转换。
- RelDataTypeSystem:类型描述类系统,SqlTypeName的辅助类,如获取精度、长度、是否自增等属性。
- RelDataType:类型描述类,用于描述一个算式或查询返回的一行的类型,即可以用于描述一个或多个的SqlType。RelDataType支持持久化,支持枚举组成RelDataType的每一个元素的类型。
- RelDataTypeFactory:类型描述类工厂,支持从一个Clazz获取对应的RelDataType,支持从SqlType转换为RelDataType。
RelDataType是类型的描述类,借助TypeSystem、TypeName、TypeFamily,RelDatType获得了元数据的能力,通过RelDataTypeFactory,可以实现不同的类型转换。SqlLiteral是SQL描述,提供了变量的最初的信息。