创建列表分区表

用户可以采用列表分区显示地控制如何将数据行映射到各个子分区表。用户在各子分区表的定义中指定一个分区键离散值的列表,从而实现列表分区。用户可以采用列表分区,将无序或互不相关的数据进行分组整理。

创建列表分区的语法与创建范围分区语法类似,只是在创建列表分区时要在CREATE TABLE语句里指定PARTITION BY LIST从句,以及在PARTITION从句中指定列表修饰符literal值。与范围分区及哈希分区有所区别,列表分区不支持分区键中包含多列。如果一个表采用列表分区方式,那么分区键只能由此表的单列构成。

在采用列表分区时,应注意以下规则:

  • list_values_clause中至少要有一个值。同一个值,包括NULL,不可以出现在两个不同的子分区表中。
  • 用户可以定义一个 DEFAULT子分区表,在定义了此子分区表后,定义列表分区表时不必列出所有可能的分区键值,所有未被匹配的值都会被存储到DEFAULT子分区表中。
  • DEFAULT子分区表中只能有DEFAULT一个值,不能利用其它值与DEFAULT一起创建一个子分区表。DEFAULT子分区表的位置,必须是最后一个子分区表。
  • 单个子分区表的散列值的字节总数不能超过4K,所有子分区表的散列值的字节总数不能超过64K。(可以根据实际情况调节字节限制的大小)

创建列表分区举例

示例1:不含DEFAULT分区的列表分区表

下面的示例创建一个列表分区表ts_list。

--  清理环境
DROP TABLE ts_list;

-- 创建分区表
CREATE TABLE ts_list
(
    id NUMERIC(6),
    status VARCHAR(2)
)
PARTITION BY LIST (status)
(
    PARTITION p1 VALUES ('A1', 'A2'),
    PARTITION p2 VALUES ('B1', 'B2', 'B3')
);

通过检查一行数据行分区列的值与子分区表的离散值是否一致来判断该行属于哪一个分区。

例如插入以下的行

--插入p1分区
INSERT INTO ts_list VALUES(1,'A1');

--插入p2分区
INSERT INTO ts_list VALUES(2,'B2');

--插入失败,不属于任何一个分区
INSERT INTO ts_list VALUES(3,'C3');
ERROR, 插入元组没有找到合适的子分区表


--  删除表和表空间
DROP TABLE ts_list CASCADE;

和范围分区不一样,列表分区的分区没有明显的顺序。用户可以定义一个 DEFAULT 子分区表(DEFAULT子分区表只能定义在最后一个分区), 在定义了此子分区表后,定义列表分区表时不必列出所有可能的分区键值, 数据库在处理数据时也不会出现无法映射的情况。在之前的例子, 如果指定DEFAULT子分区表,那么C3就被映射到DEFAULT子分区表。

示例2:含DEFAULT分区的列表分区表

下面的例子使用列表分区方法创建表ts_list。 前面两个子分区表定义自己的物理属性,而其他的子分区表则继承表级别的默认属性。 同时也定义一个DEFAULT子分区表

--  清理环境
DROP TABLE ts_list;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

--  创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;

-- 创建分区表
CREATE TABLE ts_list
(
    id NUMERIC(6),
    status VARCHAR(2)
)
PARTITION BY LIST (status)
(
    PARTITION p1 VALUES ('A1', 'A2') TABLESPACE ts1,
    PARTITION p2 VALUES ('B1', 'B2', 'B3') TABLESPACE ts2,
    PARTITION p_null VALUES (NULL),
    PARTITION p_unknown VALUES (DEFAULT)
);

--  删除表和表空间
DROP TABLE ts_list CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;