Gbase创建分区功能详细说明

本文详细介绍了数据库分区表的概念,包括RANGE、LIST、HASH和KEY四种分区方法,以及子分区的创建。提供了创建不同类型的分区表的SQL语法示例,并强调了分区表的管理操作和注意事项,如分区数量限制、命名规范等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.功能说明

分区表是根据一定规则,将数据库中的一张表分解成多个更小的容易管理的部分,
从逻辑上看,只有一张表,但底层却是由多个物理分区组成。
分区表包括普通分区表和子分区表。
目前常用的分区方法有如下:

RANGE 分区:一个连续范围

LIST 分区:一个个的单独指定的值,可以不连续

KEY 分区:支持各种数据类型,比如字符串,的hash分类方式

HASH 分区:针对数字的的hash

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

分区表支持分区列类型
数值型:INT,BIGINT,SMALLINT,FLOAT。
时间类型(作为分区函数的输入值使用):DATE,DATETIME,TIME。

分区注意事项
包括子分区在内所有分区总和个数不大于 8192;
创建分区表过程中,磁盘空间不足,报错;
创建分区表过程中,分区名字有重复,报错;
创建分区表过程中,分区名字不符合命名规范,报错,分区表命名规范与普通表一致;
不支持每个分区指定不同的 tablespace;
创建分区表时未指定分区名,分区名默认为 p0,p1…;
分区列不支持 update 操作;
每个分区的子分区个数必须相同;
只有 range 分区与 list 分区可以创建子分区。

创建分区语法
partition_options:
 PARTITION BY RANGE(expr)
 (partition_definition [, partition_definition] ...)
[SUBPARTITION BY]
{ [LINEAR] HASH(expr)
| [LINEAR] KEY(column_list) }
[SUBPARTITIONS num]
partition_definition:
 PARTITION partition_name
 VALUES LESS THAN {(expr) | MAXVALUE}
 [(subpartition_definition [, subpartition_definition] ...)]
subpartition_definition:
SUBPARTITION logical_name

注意:
expr 是某列值或一个基于某个列值、并返回一个整数值的表达式
各分区的 expr 列表的值必须递增
批量建立子分区,SUBPARTITIONS num ,对于key和hash的子分区批量建立,不指定名字

支持分区中使用的函数
abs(), ceiling(), ceil(), datediff(), 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()

2.分区创建示例

2.1创建RANGE分区

语法:
 PARTITION BY RANGE(expr)
 (partition_definition [, partition_definition] ...)
[SUBPARTITION BY]
{ [LINEAR] HASH(expr)
| [LINEAR] KEY(column_list) }
[SUBPARTITIONS num]
partition_definition:
 PARTITION partition_name
VALUES LESS THAN {(expr) | MAXVALUE}
 [(subpartition_definition [, subpartition_definition] ...)]
subpartition_definition:
SUBPARTITION logical_name

注意:
expr 是某列值或一个基于某个列值、并返回一个整数值的表达式;
各分区的 expr 列表的值必须递增。

普通范围分区指定

CREATE TABLE t_range (
id INT ( 11 ) DEFAULT NULL,
NAME VARCHAR ( 10 ) DEFAULT NULL
)REPLICATED PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN ( 10 ),
PARTITION p1 VALUES LESS THAN ( 20 ),
PARTITION p2 VALUES LESS THAN ( 30 ),
PARTITION p3 VALUES less than MAXVALUE);

创建 RANGE 分区表,带 hash 子分区,每个RANGE分区带4个子分区,不指定子分区名

create table t_range (id int, dt date)
partition by range (id)
subpartition by hash (quarter(dt))
subpartitions 4
(
partition p0 values less than (1990),
partition p1 values less than (2000),
partition p2 values less than maxvalue
);

创建 RANGE 分区表,带 hash 子分区,每个RANGE分区指带四个子分区,指定子分区名

create table t_range (id int, dt date)
partition by range (id)
subpartition by hash (quarter(dt))
(
partition p0 values less than (1990)
(
subpartition part0_q1,
subpartition part0_q2,
subpartition part0_q3,
subpartition part0_q4
),
partition p1 values less than (2000)
(subpartition part1_q1,
subpartition part1_q2,
subpartition part1_q3,
subpartition part1_q4
),
partition p2 values less than MAXVALUE
(subpartition part2_q1,
subpartition part2_q2,
subpartition part2_q3,
subpartition part2_q4
)
)

创建 RANGE 分区表,带 key 子分区,每个RANGE分区指带四个子分区,不指定子分区名

create table t_range (id int, dt date)
partition by range (id)
subpartition by key (dt)
subpartitions 4
(
partition p0 values less than (1990),
partition p1 values less than (2000),
partition p2 values less than maxvalue
); 

创建 RANGE 分区表,带 key 子分区,每个RANGE分区指带四个子分区,指定子分区名

create table t_range (id int, dt date)
partition by range (id)
subpartition by key (dt)
(
partition p0 values less than (1990)
(
subpartition part0_q1,
subpartition part0_q2,
subpartition part0_q3,
subpartition part0_q4
),
partition p1 values less than (2000)
(
subpartition part1_q1,
subpartition part1_q2,
subpartition part1_q3,
subpartition part1_q4
),
partition p2 values less than maxvalue
(
subpartition part2_q1,
subpartition part2_q2,
subpartition part2_q3,
subpartition part2_q4
)
);

创建日期类型的RANGE分区 

create table t_range (id int, birth date)
partition by range(birth)
(
partition p0 values less than (to_date('1980-01-01','yyyy-mm-dd')),
partition p1 values less than (to_date('2000-01-01','yyyy-mm-dd')),
partition p2 values less than MAXVALUE
);

2.2创建LIST分区

语法:
 PARTITION BY LIST(expr)
 (partition_definition [, partition_definition] ...)
[SUBPARTITION BY]
 { [LINEAR] HASH(expr) | [LINEAR] KEY(column_list) }
[SUBPARTITIONS num]
partition_definition:
 PARTITION partition_name
 VALUES IN (value_list)
 [(subpartition_definition [, subpartition_definition] ...)]
subpartition_definition:
 SUBPARTITION logical_name

注意:
expr
是某列值或一个基于某个列值、并返回一个整数值的表达式
value_list是一个通过逗号分隔的整数列表

创建 LIST 分区表

create table t_list (a int, b varchar(10))
partition by list(a) (
partition p0 values in (1,3,5,7,9),
partition p1 values in (2,4,6,8,10)
); 

创建 LIST 分区表,带 hash 子分区,每个LIST分区四个子分区,不指定子分区名

create table t_list (a int, b int)
partition by list(a)
subpartition by hash(b)
subpartitions 4
(
partition p0 values in (1,3,5,7,9),
partition p1 values in (2,4,6,8,10)
)

创建 LIST 分区表,带 hash 子分区,每个LIST分区四个子分区,指定子分区名

create table t1 (a int, b int)
partition by list(a)
subpartition by hash (b)
(
partition p0 values in (1,3,5,7,9)
(
subpartition part0_q1,
subpartition part0_q2,
subpartition part0_q3,
subpartition part0_q4
 ),
partition p1 values in (2,4,6,8,10)
(
subpartition part1_q1,
subpartition part1_q2,
subpartition part1_q3,
subpartition part1_q4
)
); 

创建 LIST 分区表,带 key 子分区,每个LIST分区四个子分区,不指定子分区名

create table t_list (a int, b int)
partition by list(a)
subpartition by key (b)
subpartitions 4
(
partition p0 values in (1,3,5,7,9),
partition p1 values in (2,4,6,8,10)
); 

创建 LIST 分区表,带 key 子分区,每个LIST分区四个子分区,指定子分区名

create table t_list (a int, b int)
partition by list(a)
subpartition by key (b)
(
partition p0 values in (1,3,5,7,9),
(
subpartition part0_q1,
subpartition part0_q2,
subpartition part0_q3,
subpartition part0_q4 
),
partition p1 values in (2,4,6,8,10)
(
subpartition part1_q1,
subpartition part1_q2,
subpartition part1_q3,
subpartition part1_q4
)
);

2.3创建HASH分区

语法:
PARTITION BY [LINEAR] HASH(expr)
[PARTITIONS num]
[(partition_definition [, partition_definition] ...)]
partition_definition:
PARTITION partition_name

expr是一个返回一个整数的表达式,其他类型不支持hash分区,也可以是字段类型为整型的物理列的名字
创建分区表过程中,分区数量num 大于 8192,报错
创建分区表过程中,分区数量num 等于 0,报错

创建单列hash表分区,分区数量为10

create table t_hash (a int, b varchar(10)) 
partition by hash(a)
PARTITIONS 10;

创多列 hash 表分区,注意字段加单引号

create table t_hash (a int,b int,c varchar(10)) 
distributed by('a','b'); 

2.4创建KEY分区

语法:
PARTITION BY [LINEAR] KEY(column_list)
[PARTITIONS num]
[(partition_definition [, partition_definition] ...)]
partition_definition:
PARTITION partition_name

column_list 是只采用一个或多个列名的一个列表;
创建分区表过程中,num 大于 8192,报错;
创建分区表过程中,num 等于 0,报错。

创建key分区表

create table t_key (a int, name varchar(10)) 
partition by key(a);

创建key分区指定分区名字

create table t_key (a int, name varchar(10)) 
partition by key(name)
(
partition p0,
partition p1         
);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值