为创新型的实时OLAP服务,分析型数据库提供很多独有的特色功能,这里便就其中常用的部分进行简要的介绍。
聚集列
在创建表时,用户可以指定一列或者若干列作为聚集列。
- 在物理上,一个分区内聚集列内容相同的数据会尽可能的分布在同样的区块内存放。因此当用户的查询Query的条件指定了聚集列的内容或范围时,查询性能会有较大的提升。
- 需要注意的是如果用户指定多列为聚集列,那么指定的聚集列的顺序就是比较数据是否相同的顺序。
- 聚集列可以在建表后进行修改,但是目前修改后需重新装载数据完毕后才生效。
多值列
分析型数据库有一个特殊的数据类型:多值列。
- 多值列可以存入String类型的多个值。在原始数据中多值列为一列用分隔符(默认为半角逗号,也可以建表时进行配置)分隔的String类型。
- 多值列数据存入分析型数据库后,可使用in,contains条件对该列的单个值进行查询,枚举查询后该列的每个值可像一个普通列一样进行各类操作。但是不允许在没有进行枚举查询时对该列直接select或在groupby中使用该列。
多值列的通常使用场景:
已有一个实体属性表均为普通列并以实体编号为主键的情况下,需要新增一个用于进行实体筛选的属性,而这个属性和实体编号为多对多的对应关系,按照通常的做法,则新建一张该实体编号和属性两列的数据表,和原有的实体属性表进行Join操作查询。而使用多值列后,
性能会被进行Join操作计算高数倍。
一个具体的例子如下:
一张用户表中已有用户id和性别、年龄、职业、籍贯的数据。
而现在需要增加用户购买的商品品类的数据用于筛选,于是可以将这个商品的品类id存放在用户表的一个新增的多值列中使用。
智能自动索引
分析型数据库拥有智能的自动索引创建机制。
通常情况下,分析型数据库会根据导入的数据的每一列分布情况自动为每一列创建符合该列情况的索引类型,无需用户指定创建索引或索引类型。
注:导入数据每一列分布情况如该列的枚举值数量的多少,该列的数据是连续或离散。
但是,如果用户认为某一列不需要进行筛选查询,可以指定该列不需要创建索引来节省数据存储空间。
注:0.9版本之前如果一个列需要作为表关联的hash 分区列,那么用户需要人工指定该列创建Hash索引。0.9版本已废弃Hash索引,可动态根据JoinSQL进行优化,完全无需用户干预。
查询CBO优化
分析型数据库拥有高度智能的CBO(Cost-Based Optimization)优化策略。
在用户发起的一个Query达到分析型数据库后,分析型数据库会智能的判断该Query涉及的数据的分布情况、索引使用情况、缓存使用情况、Query条件分布等,进行逻辑和物理执行计划优化和重组,尽可能的以最优的路径执行Query查询。
因此大部分情况下用户无需关心Query的具体写法,只要保证语义正确即可。另外分析型数据库提供一些Hint参数,可以在Query时对执行计划进行部分调整,详见《用户指南》的《多计算引擎和Hint》章节。