暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8a 集群支持分区表功能使用样例

原创 Danny 2021-06-24
2990

GBase 8a 数据库集群,从V9版本才支持分区功能,V8不支持分区。分区表是根据一定规则,将数据库中的一张表分解成多个更小的容易管理的部分,从逻辑上看,只有一张表,但底层却是由多个物理分区组成。分区表包括普通分区表和子分区表。

数据库版本

不同的版本可能功能有变动,如需要了解详情,请咨询数据库厂商当前最新版本的情况。本文也会尽量同步更新。

gbase> select @@version;
+-----------------+
| @@version       |
+-----------------+
| 9.5.2.26.121440 |
+-----------------+
1 row in set (Elapsed: 00:00:00.00)


支持的分区类型

目前常用的分区方法有RANGE分区、LIST分区、KEY分区、HASH分区,在分区的管理上目前支持创建分区、添加分区、删除分区。
RANGE分区表和LIST分区表支持子分区,子分区的分区类型可以为[LINEAR] HASH和[LINEAR] KEY。
information_schema.partitions中可以查到所创建的分区表信息。

  • RANGE : 一个连续范围
  • LIST : 一个个的单独指定的值,可以不连续
  • KEY: 支持各种数据类型,比如字符串,的hash分类方式。
  • HASH: 针对数字的的hash

分区表支持分区列类型

数值型, 如: int, bigint, smallint, float 等
时间类型: date,datetime, time

支持分区函数

abs(), ceiling(), ceil(), datadiff(), day(), dayofmonth(), dayofweek(),dayofyear(), floor(), hour(), microsecond(), minute(), mod(),month(), quarter(), second(), time_to_sec(), to_days(), to_seconds(),weekday(), year(),yearweek(), +, -, *, /, div, %, extract(),from_days()

分区

range 分区

数字类型的range分区

partition by range(id)(
  partition p1 values less than (10), 
  partition po values less than MAXVALUE
);
Query OK, 0 rows affected (Elapsed: 00:00:02.29)

日期类型的RANGE分区

    partition by range(birth)
   (
        partition p1357_1980 values less than (to_date('1980-01-01','yyyy-mm-dd')),
        partition p1357_2000 values less than (to_date('2000-01-01','yyyy-mm-dd')),
        partition p1357_other values less than MAXVALUE
    );

多列RANGE分区

当前版本尚不支持,但后续可能会实现。

gbase>     create table t_range_multi(id int, name varchar(100),birth date)
    ->     partition by range(id,birth)
    ->    (
    ->         partition p1357_1980 values less than (10,to_date('1980-01-01','yyyy-mm-dd')),
    ->         partition p1357_2000 values less than (20,to_date('2000-01-01','yyyy-mm-dd')),
    ->         partition p1357_other values less than MAXVALUE
    ->     );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your GBase server version for the right syntax to use near 'birth)
   (
        partition p1357_1980 values less than (10,to_date('1980-01-0' at line 2
gbase>

list分区

partition by list(id)(   
  partition a values in (1,3,5,7),
  partition b values in (2,4,6,8) 
);
Query OK, 0 rows affected (Elapsed: 00:00:00.61)

Key分区

int类型的key分区

    partition by key(id)
    (
         partition p01,
         partition p02         
    );

gbase> create table t_key_int(id int, name varchar(100),birth date)
    ->     partition by key(id)
    ->     (
    ->          partition p01,
    ->          partition p02
    ->     );
Query OK, 0 rows affected (Elapsed: 00:00:00.16)

varchar类型的key分区

    partition by key(name)
    (
         partition p01,
         partition p02         
    );
gbase> create table t_key_varchar(id int, name varchar(100),birth date)
    ->     partition by key(name)
    ->     (
    ->          partition p01,
    ->          partition p02
    ->     );
Query OK, 0 rows affected (Elapsed: 00:00:00.17)

date类型的key分区

    partition by key(birth)
    (
         partition p01,
         partition p02         
    );

gbase> create table t_key_date(id int, name varchar(100),birth date)
    ->     partition by key(birth)
    ->     (
    ->          partition p01,
    ->          partition p02
    ->     );
Query OK, 0 rows affected (Elapsed: 00:00:00.42)

Hash分区

数字类型的hash分区
整数在内部,就是按照数字的mod值进行划分。比如10个节点,数字0保存在第1个分区,数字9保存在第10个分区。

create table t_hash_int(id int, name varchar(100),birth date)
    partition by hash(id)
    (
         partition p01,
         partition p02         
    );
gbase> create table t_hash_int(id int, name varchar(100),birth date)
    ->     partition by hash(id)
    ->     (
    ->          partition p01,
    ->          partition p02
    ->     );
Query OK, 0 rows affected (Elapsed: 00:00:00.17)

其它类型的hash分布不支持

    ->     partition by hash(name)
    ->     (
    ->          partition p01,
    ->          partition p02
    ->     );
ERROR 1702 (HY000): gcluster table error: The PARTITION function returns the wrong type.
gbase> create table t_hash_date(id int, name varchar(100),birth date)
    ->     partition by hash(birth)
    ->     (
    ->          partition p01,
    ->          partition p02
    ->     );
ERROR 1050 (42S01): Table 't_hash_date' already exists
gbase> drop table t_hash_date;
Query OK, 0 rows affected (Elapsed: 00:00:00.04)

gbase> create table t_hash_date(id int, name varchar(100),birth date)
    ->     partition by hash(birth)
    ->     (
    ->          partition p01,
    ->          partition p02
    ->     );
ERROR 1702 (HY000): gcluster table error: The PARTITION function returns the wrong type.
gbase>

PARTITIONS num 批量建立

批量生成一定的分区,不再指定分区名字,适合key和hash分区类型。

gbase> create table t_key_varchar(id int, name varchar(100),birth date)
    ->     partition by key(name)
    ->     PARTITIONS 10;
Query OK, 0 rows affected (Elapsed: 00:00:00.54)

子分区

key和hash不能再有子分区,只允许RANGE/LIST可以拥有子分区,包括hash/key子分区类型。

提示:当前集群版本,还不支持range-list这样的子分区格式,具体当前最新版本支持详情,还请咨询数据库厂商。

语法

PARTITION BY
{ RANGE(expr)
| LIST(expr)
| LINEAR] HASH(expr)
| [LINEAR] KEY(column_list)}
[PARTITIONS num]

[SUBPARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY(column_list) }
[SUBPARTITIONS num]
]

样例

如下是日期类型的Range分区带hash类型的子分区的例子。

    create table t_list_2(id int, name varchar(100),birth date)
    partition by range(birth)
    subpartition by hash(id)
   (
        partition p1357_1980 values less than (to_date('1980-01-01','yyyy-mm-dd'))(
            subpartition a1980,
            subpartition b1980 
        ),
        partition p1357_2000 values less than (to_date('2000-01-01','yyyy-mm-dd'))(
            subpartition a2000,
            subpartition b2000 
        ),
        partition p1357_other values less than MAXVALUE(
            subpartition aother,
            subpartition bother 
        )
    );

SUBPARTITIONS num 批量建立

对于key和hash的子分区,可以批量建立,不指定名字。

    create table t_range_hash(id int, name varchar(100),birth date)
    partition by range(birth)
    subpartition by hash(id) subpartitions 2
   (
        partition p1357_1980 values less than (to_date('1980-01-01','yyyy-mm-dd')),
        partition p1357_2000 values less than (to_date('2000-01-01','yyyy-mm-dd')),
        partition p1357_other values less than MAXVALUE
    );


最后修改时间:2021-06-24 15:36:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论