GBase 8s数据库表分片介绍

GBase 8s数据库在语法上支持Round-Robin(轮询调度),Expression-Based(基于表达式),List(列表式),Range(区间)四种分片方式。
1,Round-Robin(轮询调度)
插入数据是按照顺序逐条往各个分片上写。
特点:
简单,不需要了解数据的分布
把数据均匀地分配到所有分片中
提高查询性能
只能用于表,不能用于索引
不能用于分片忽略以增加性能

语法示例:

create table tab_round_robin
(
  id int,
  name varchar(40),
  nation varchar(40),  
  regtime datetime year to second default current year to second not null 
) fragment by round robin 
  in datadbs1,datadbs2,datadbs3,datadbs4;

如果需要创建索引,需要显示的指定in dbspace,如:

create index ix_tab_round_robin_id on tab_round_robin(id) in datadbs1;

2,Expression-Based(基于表达式)
插入数据是按照匹配表达式结果的方式,往相应的分片上写。
特点:
需要对数据分布有所了解
为分片忽略和性能提升提供可能
既可以用于表也可以用于索引
可以基于一列或者多列构建表达式
语法示例:

create table tab_expression_based
(
  id int,
  name varchar(40),
  nation varchar(40),  
  regtime datetime year to second default current year to second not null 
) fragment by expression 
id < 100 in datadbs1,
id < 200 in datadbs2,
id < 300 in datadbs3,
REMAINDER in datadbs4;

基于表达式的分片的数据是根据第一个匹配的表达式来分配存储位置的,可以在表达式的最后使用REMAINDER分片,用于保存不满足之前任何表达式的记录。

3,List(列表式)
插入数据是按照离散值列表的的区配方式
可以认为是基于表达式的特例。

create table tab_list
(
  id int,
  name varchar(40),
  nation varchar(40),  
  regtime datetime year to second default current year to second not null 
) fragment by list(nation) 
partition p0 values('汉族') in datadbs1,
partition p1 values('壮族','藏族') in datadbs2,
partition p2 values('高山族','满族','朝鲜族') in datadbs3,
partition p3 values(NULL) in datadbs4,
partition p4 REMAINDER in datadbs5;

该列表式可以可选地包含 remainder 分片,也可以可选地包含只存储 NULL 值的 NULL 分片。

4,Range(区间)
支持数值,date和datetime类似
包含范围分片(在 FRAGMENT BY 或 PARTITION BY 子句中显式定义的分片)和 间隔分片(数据库服务器在插入操作期间自动创建的分片)两种。

create table tab_range_interval
(
  id int,
  name varchar(40),
  nation varchar(40),  
  regtime datetime year to second default current year to second not null 
) fragment by range(regtime) interval(1 units month)
rolling (6 fragments) detach
store in (datadbs1,datadbs2,datadbs3,datadbs4,datadbs5,datadbs6)
partition p0 values < '2019-01-01 00:00:00' in datadbs1;

说明:

  • 1)store in选项中的dbspace,是按round robin方式使用。若需要绑定相应的分片和dbspace,需要使用自定义返回dbspace名称的函数方式。
create function mydbs
(
  owner char(32),    -- 所有者
  table char(255),   -- 表名
  value datetime year to second,   -- 与分片键同一数据类型的分片值,或者可以隐式强制转型为那个数据类型的兼容类型
  retry int          -- 重新尝试标记
) returns char(255)  
  if (mod(month(value),6) == 0)
  then
    return "datadbs1";
  elif (mod(month(value),6) == 1)
  then
    return "datadbs2";
  elif (mod(month(value),6) == 2)
  then
    return "datadbs3";
  elif (mod(month(value),6) == 3)
  then
    return "datadbs4";
  elif (mod(month(value),6) == 4)
  then
    return "datadbs5";
  else
    return "datadbs6";
  end if;
end function;

注:4个输入参数名称均为指定的。

create table tab_range_interval_store_func
(
  id int,
  name varchar(40),
  nation varchar(40),  
  regtime datetime year to second default current year to second not null 
) fragment by range(regtime) interval(1 units month)
rolling (6 fragments) detach
store in (mydbs())
partition p0 values < '2019-01-01 00:00:00' in datadbs1;

当我们插入记录时,比如今天的记录(2019-08-31),那么将会插入到datadbs3中(mod(8,6)==2)。

  • 2)rolling 可选子句,指明保留的分片数量,当超过指定的分片数量时,进行detach(拆除)或者discard(销毁)操作
    datech或者discard操作并非在达到指定分片数量时立即执行,而是通过sysadmin库的定时任务purge_tables在00:45开始执行。

标签: list, 分片表, fragment, range, interval, round robin

评论已关闭