更新时间:2025-05-29 GMT+08:00

列表分区

列表分区(List Partition)允许用户在每个分区的描述里,为分区键指定离散值列表,从而控制数据行如何被映射到各个分区。这种分区方式的优势在于,它能以枚举分区值的形式对数据进行分区操作,尤其适合对无序且不相关的数据集进行分组与组织。

在处理分区键值时,若某些值未被定义在列表之中,用户可以借助默认分区(DEFAULT)来存储这些数据。通过这种方式,所有未能映射到其他任何分区的行都不会导致错误产生。示例如下:

gaussdb=# CREATE TABLE bmsql_order_line (
    ol_w_id          INTEGER   NOT NULL,
    ol_d_id          INTEGER   NOT NULL,
    ol_o_id          INTEGER   NOT NULL,
    ol_number        INTEGER   NOT NULL,
    ol_i_id          INTEGER   NOT NULL,
    ol_delivery_d    TIMESTAMP,
    ol_amount        DECIMAL(6,2),
    ol_supply_w_id   INTEGER,
    ol_quantity      INTEGER,
    ol_dist_info     CHAR(24)
)
PARTITION BY LIST(ol_d_id)
(
    PARTITION p0 VALUES (1,4,7),
    PARTITION p1 VALUES (2,5,8),
    PARTITION p2 VALUES (3,6,9),
    PARTITION p3 VALUES (DEFAULT)
);

--删除表。
gaussdb=# DROP TABLE bmsql_order_line;

上述例子和之前给出的哈希分区的例子类似,同样依据ol_d_id列来进行分区。但是在List分区中直接通过对ol_d_id的可能取值范围进行限定,不在列表中的数据会进入p3分区(DEFAULT)。

相比哈希分区,列表分区对分区键的可控性更强,通常能够精准地把目标数据存放在预期的分区中。然而,要是列表中的取值较多,分区定义工作就会变得繁琐。在这种情形下,建议采用哈希分区。

总体而言,列表分区和哈希分区常用于对无序、不相关的数据集进行分组与组织。

列表分区在分区键设置上有明确的数量限制,其分区键最多可支持16列。并且,分区键列数不同时,子分区定义时列表中枚举值对NULL值的处理规则也不同。当分区键仅定义为1列时,子分区列表里的枚举值不允许为NULL值;而当分区键定义为多列时,子分区列表中的枚举值则允许存在NULL值。