前言
目前二级分区支持的分类有8种:
- 一级分区是范围分区
范围-范围分区
范围-列表分区
范围-哈希分区 - 一级分区是列表分区
列表-范围分区
列表-列表分区
列表-哈希分区 - 一级分区是哈希分区
哈希-范围分区
哈希-列表分区
一、一级分区是范围分区的二级分区的创建
该功能仅在 GBase 8s 的 ORACLE 模式下支持。
SECOND LEVEL PARTITION 子句语法图:
Range Partition Desc语法图:
Range Subpartition Desc语法图:
List Subpartition Desc语法图:
individual_Hash_Subpartitions语法图:
元素 | 描述 | asd |
---|---|---|
电脑 | $1600 | |
手机 | $12 |
元素 | 描述 | 限制 | 语法 |
---|---|---|---|
column | 应用分片存储策略的列 | 必须是表中的列 | 标识符 |
dbspace_name | 存储表分片的 | Dbspace最多可以指定 2,048 个 dbspaces。所有存储分片的 dbspaces 必须具有相同的页大小。 | 标识符 |
partition | 此处为分片声明的名称 | 在该表的分片名称中必须是唯一的 | 标识符 |
subpartition_name | 此处为二级分区声明的名称 | 在该表的分片名称中必须是唯一的 | 标识符 |
interal | 分区字段进行分区的值,如果是二级范围分区values less than Interal则是小于这个值如果是二级列表分区则是等于这个值 | 必须是与分片键表达式的数据类型符合的值 | 标识符 |
用法
- 一级分区可以指定一个或多个字段做分区字段;
- 二级分区可以在范围,列表,哈希选择其中一种,不能多种二级分区混合使用;
- 二级分区为范围分区或者哈希分区可以指定一个或者多个字段做分区字段;
- 二级分区为列表分区只能指定一个字段当做分区字段;
- 一级分区不能指定dbspace;
- 二级分区为范围分区或者哈希分区可以指定dbspace,如果不明确指定则会使用数据库默认dbspace,二级分区为列表分区必须明确指定使用的dbspace;
- 一级分区和二级分区的范围分区如果定义多个字段做分区字段,如果其中一个字段设置了maxvalue,那么这个分区的所有字段需要同时设置为maxvalue;
- 每个一级范围分区下都可以有一个二级分区设置maxvalue;
- 二级范围分区只能有一个子分区为maxvalue;
- 整个表分区范围必须按照从小到大创建;
- 整个表的所有二级列表分区只能有一个null;
- 目前布尔类型(BOOLEAN)、LVARCHAR类型、虚拟列和ROWNUM不支持做分区字段;
- 表内的分区字段与非分区字段均不允许重命名列名操作(RENAME COLUMN) 。
示例
范围-范围分区表示例如下:
create table tab1(
cust_id integer,
name char(128),
score integer
)
partition by range(cust_id)
subpartition by range(score)
(
partition p0 values less than (100)
(
subpartition p0_1 values less than (50) dbspace dbs1_1,
subpartition p0_max values less than (100) dbspace dbs1_2
) ,
partition p1 values less than (200)
(
subpartition p1_1 values less than (150) dbspace dbs2_1,
subpartition p1_max values less than (200) dbspace dbs2_1
)
);
范围-列表分区表示例如下:
create table tab2(
cust_id integer,
name char(128),
score integer
)
partition by range(cust_id)
subpartition by list(score)
(
partition p0 values less than (100)
(
subpartition shangxun1 values(1,2,3) in dbs1,
subpartition zhongxun1 values(4,5,6) in dbs2
)
);
范围-哈希分区表示例如下:
create table tab3(
cust_id integer,
name char(128),
score integer
)
partition by range(cust_id)
subpartition by hash(score)
(
partition p0 values less than (100)
(
subpartition p0_1 dbspace datadbs1,
subpartition p0_2 dbspace datadbs2
)
);
二、一级分区是列表分区的二级分区的创建
该功能仅在 GBase 8s 的 ORACLE 模式下支持。
SECOND LEVEL PARTITION 子句语法图:
List Partition Desc语法图:
Range Subpartition Desc语法图:
List Subpartition Desc语法图:
individual_Hash_Subpartitions语法图:
元素 | 描述 | 限制 | 语法 |
---|---|---|---|
column | 应用分片存储策略的列 | 必须是表中的列 | 标识符 |
dbspace_name | 存储表分片的 | Dbspace最多可以指定 2,048 个 dbspaces。所有存储分片的dbspaces 必须具有相同的页大小。 | 标识符 |
partition | 此处为分片声明的名称 | 在该表的分片名称中必须是唯一的 | 标识符 |
subpartition_name | 此处为二级分区声明的名称 | 在该表的分片名称中必须是唯一的 | 标识符 |
Interal | 分区字段进行分区的值,如果是二级范围分区values less than Interal则是小于这个值如果是二级列表分区则是等于这个值 | 必须是与分片键表达式的数据类型符合的值 | 标识符 |
用法
- 一级分区只能指定一个字段做分区字段;
- 二级分区可以在范围,列表,哈希选择其中一种,不能多种二级分区混合使用;
- 二级分区为范围分区或者哈希分区可以指定一个或者多个字段做分区字段;
- 二级分区为列表分区只能指定一个字段当做分区字段;
- 一级分区不能指定dbspace。当二级分区是范围分区且没有定义二级分区范围,只定义了唯一的一级分区的时候,如果是一级列表分区必须使用in dbspace_name语法指定dbspace;
- 二级分区为范围分区或者哈希分区可以指定dbspace,如果不明确指定则会使用系统默认dbspace;
- 二级分区为列表分区必须明确指定使用的dbspace;
- 二级分区的范围分区如果定义多个字段做分区字段,如果其中一个字段设置了maxvalue,那么这个分区的所有字段需要同时设置为maxvalue;
- 二级范围分区只能有一个子分区为maxvalue;
- 整个表的所有二级列表分区只能有一个null;
- 目前布尔类型(BOOLEAN)、LVARCHAR类型、虚拟列和ROWNUM不支持做分区字段;
- 表内的分区字段与非分区字段均不允许重命名列名操作(RENAME COLUMN) 。
示例
列表-范围分区示例如下:
create table tab4(
cust_id integer,
name char(128),
score integer
)
partition by list(cust_id)
subpartition by range(score)
(
partition p0 values (100)
(
subpartition p0_1 values less than (50) dbspace dbs1_1,
subpartition p0_max values less than (100) dbspace dbs1_2
)
);
列表-列表分区示例如下:
create table tab5(
cust_id integer,
name char(128),
score integer
)
partition by list(cust_id)
subpartition by list(score)
(
partition p0 values (100)
(
subpartition shangxun1 values(1,2,3) in dbs1,
subpartition zhongxun1 values(4,5,6) in dbs2
)
);
列表-哈希分区示例如下:
create table tab6(
cust_id integer,
name char(128),
score integer
)
partition by list(cust_id)
subpartition by hash(score)
(
partition p0 values (100)
(
subpartition p0_1 dbspace datadbs1,
subpartition p0_2 dbspace datadbs2
)
);
三、一级分区是哈希分区的二级分区的创建
该功能仅在 GBase 8s 的 ORACLE 模式下支持。
SECOND LEVEL PARTITION 子句语法图:
Individual_Hash_Partitions语法图:
Range Subpartition Desc语法图:
List Subpartition Desc语法图:
元素 | 描述 | 限制 | 语法 |
---|---|---|---|
column | 应用分片存储策略的列 | 必须是表中的列 | 标识符 |
dbspace_name | 存储表分片的 Dbspace | 最多可以指定 2,048 个 dbspaces。所有存储分片的 dbspaces 必须具有相同的页大小。 | 标识符 |
partition | 此处为分片声明的名称 | 在该表的分片名称中必须是唯一的 | 标识符 |
subpartition_name | 此处为二级分区声明的名称 | 在该表的分片名称中必须是唯一的 | 标识符 |
Interal | 分区字段进行分区的值,如果是二级范围分区values less than Interal则是小于这个值如果是二级列表分区则是等于这个值 | 必须是与分片键表达式的数据类型符合的值 | 标识符 |
用法
- 一级分区只能指定一个或多个字段做分区字段;
- 二级分区可以在范围,列表选择其中一种,不能多种二级分区混合使用;
- 二级分区为范围分区可以指定一个或者多个字段做分区字段;
- 二级分区为列表分区只能指定一个字段当做分区字段;
- 一级分区不能指定dbspace;
- 二级分区为范围分区可以指定dbspace,如果不明确指定则会使用系统默认dbspace;
- 二级分区为列表分区必须明确指定使用的dbspace;
- 二级分区的范围分区如果定义多个字段做分区字段,如果其中一个字段设置了maxvalue,那么这个分区的所有字段需要同时设置为maxvalue;
- 哈希分区只能使用指定分区名写法;
- 二级范围分区只能有一个子分区为maxvalue;
- 整个表的所有二级列表分区只能有一个null;
- 目前布尔类型(BOOLEAN)、LVARCHAR类型、虚拟列和ROWNUM不支持做分区字段;
- 表内的分区字段与非分区字段均不允许重命名列名操作(RENAME COLUMN) 。
示例
哈希-范围分区表示例如下:
create table tab7(
pid number(10),
pname varchar(30),
sex varchar(20),
create_date date
)
partition by hash(sex)
subpartition by range(pname)
(
partition p1
(
subpartition p1_1 values less than('aa'),
subpartition p1_2 values less than('dd')
),
partition p2
(
subpartition p2_1 values less than('ff'),
subpartition p2_2 values less than('kk')
)
);
哈希-列表分区表示例如下:
create table tab8(
sid number,
sex varchar(20),
province varchar(20)
)
partition by hash(sex)
subpartition by list(province)
(
partition p1
(
subpartition north values('河南','安徽','河北','山东') in dbs1,
subpartition south values('广东','海南','广西','江西') in dbs1_1,
subpartition west values('青海','宁夏','山西') in dbs1_2,
subpartition east values('上海','浙江','江苏') in dbs2
),
partition p2
);