表分区#

针对大的数据仓库事实表,往往我们可以通过对表进行分区的方式来把一个很大的表拆分成多个子表。这样的话,有两个好处:

  • 查询优化器可以针对分区表进行优化,如果查询只涉及到某些分区,则查询计划只需要扫描这些分区,从而加速查询

  • 如果我们按照日期进行分区的话,我们可以简单的加入分区和删除过期的分区。

分区表的目的是为了提高查询性能,但并非所有的表都适合做分区。只有大型事实表、经常使用特定>条件[日期、地区等]查询数据、维护历史数据、数据分布均匀的情况,可通过分区策略大大提升使用性能。且分区数不宜过多,否则会影响维护和管理工作速度。

当前 OushuDB 的 HORC 表支持动态分区,MAGMA 表暂时不支持分区,即将支持动态分区。

动态分区机制#

动态分区机制是指在建表时指定分区字段,每个子分区仅存储一个分区键的值。当往动态分区表中插入数据时,会根据分区字段的值写到子分区下(如果子分区不存在,则会自动创建)。动态分区机制支持多级分区,且各级分区都是键值唯一的。因为这种分区表的子表数量不固定,是动态变化的,所以被称为动态分区表。

动态分区表的子分区是由 OushuDB 自动管理,不向用户暴露,用户只能看到父表,所以使用时和普通表完全相同。OushuDB 在 scan 时会自动根据查询的 where 条件,筛选出需要扫描的子分区,从而提高查询性能。

定义动态分区表#

相比于普通表,动态分区表只要在创建时,通过 partition 来指定分区列的列名即可。我们可以创建动态分区表如下:

CREATE TABLE horc_measurement_city (
  city text,
  logdate date,
  peaktemp int,
  unitsales int
) WITH (APPENDONLY = true, ORIENTATION = horc) partition by value (logdate);

如果要创建多级动态分区表,则在 partition 中依次指定分区列的列名,并以逗号分隔。比如,按照年、月进行多级分区:

CREATE TABLE horc_ym_measurement (
  city_id int not null,
  r_year int,
  r_month int,
  peaktemp int,
  unitsales int
) WITH (APPENDONLY = true, ORIENTATION = horc) partition by value (r_year, r_month);