通过 LIST 分片

通过列表分片定义每个分片都基于分片键的离散值。

当分片键的值是在该类别集合内没有量化顺序的名义量表上的类别时,您可以使用此分片策略。当表包含分片键的有限值集合并且表上的查询具有分片键上的等式谓词时,通过列表分片很有帮助。例如,您可以按地理分片数据,它基于一个国家内省或洲的列表。每个分片中存储的行可以限制到单个分片键值,或者限制为表示分片键值的某个逻辑子集的值的列表,提供没有分片键值被两个或多个分片共享。

通过 LIST 分片还有助于逻辑上隔离数据。

通过 LIST 分片支持这三个功能:

通过 LIST 分片(或在 CREATE INDEX 语句中分片索引 )必须满足这些要求:

在以下情景中在通过 LIST 分片的表上进行 Load 、INSERT 、MERGE 或 UPDATE 操作时,会失败:

以下是通过 LIST 分片表的示例:

CREATE TABLE customer
        (id SERIAL, fname CHAR(32), lname CHAR(32), state CHAR(2), phone CHAR(12))
        FRAGMENT BY LIST (state)
        PARTITION p0 VALUES ("KS", "IL") IN dbs0,
        PARTITION p1 VALUES ("CA", "OR") IN dbs1,
        PARTITION p2 VALUES ("NY", "MN") IN dbs2,
        PARTITION p3 VALUES (NULL) IN dbs3,
        PARTITION p4 REMAINDER IN dbs3;

在以上示例中,表在列 state 上分片,该列称为分片键分区键。该分片键可以是列表达式:

FRAGMENT BY LIST (SUBSTR(phone, 1, 3))

该分片键表达式可以具有多列,如以下示例所示:

FRAGMENT BY LIST (fname[1,1] || lname[1,1])

该分片必须是不能重叠的,即在值列表中不允许重复值。例如,以下表达式列表对同一表或索引的分片无效,因为它们的 "KS" 表达式重叠:

PARTITION p0 VALUES ("KS", "IL") IN dbs0,
        PARTITION p1 VALUES ("CA", "KS") IN dbs1,
        PARTITION p0 VALUES ("KS", "OR", "NM") IN dbs0,

该列表值必须是常量字符。例如,标识符或 name 变量在以下列表中是不允许的:

PARTITION p0 VALUES (name, "KS", "IL") IN dbs0,

NULL 分片是分片键列包含具有 NULL 值的分片。不同于 FRAGMENT BY EXPRESSION 定义,您不能在相同的 LIST 分片定义中将 NULL 和 其它列表值组合。例如,下列 VALUES 列表无效:

PARTITION p0 VALUES ("KS", "IL", NULL) IN dbs0,

Remainder 分片是存储分片键值不符合显式定义分片的表达式列表中的任一表达式的行的分片。如果定义了 remainder 分片,它必须在定义列表分片策略的 FRAGMENT BY 或 PARTITION BY 子句中最后列出的分片。

在 NLSCASE INSENSITIVE 数据库中的 LIST 分片

在具有 NLSCASE INSENSITIVE 属性的数据库中,对 NCHAR 和 NVARCHAR 数据类型的列的操作会忽略字符大小写,因此数据库服务器将由相同序列字母组成的大小写变化的字符串视为重复的值。如果分片键是 NCHAR 或 NVARCHAR 列,则定义分片的字符表达式的列表还符合分片表中表达式的字符大小写变化的列值。

下列示例中,具有 'A''a'ad_state 列值将存储在 part0 分片/分区中。

CREATE TABLE addr
        (
        ad_id NCHAR(100),
        ad_street NVARCHAR(255),
        ad_apt INT,
        ad_state NCHAR(2),
        ad_zip1 INT,
        ad_zip2 INT,
        checksum CHAR(48),
        PRIMARY KEY(ad_id)
        )
        FRAGMENT BY LIST(ad_state)
        PARTITION part0 VALUES ('A', 'B', 'C', 'D') IN dbs1,
        PARTITION part1 VALUES ('E', 'F', 'G', 'H') IN dbs2,
        PARTITION part2 VALUES ('I', 'J', 'K', 'L') IN dbs3,
        PARTITION part3 VALUES ('M', 'N', 'O', 'P') IN dbs4,
        PARTITION part4 VALUES ('Q', 'R', 'S', 'T') IN dbs5,
        PARTITION part5 REMAINDER IN dbs6 LOCK MODE ROW;

设计为返回只具有 'A''a'的行的查询可以在 ad_state 列上应用过滤,以致于只有第一个分片在查询执行计划中扫描:

SELECT * FROM addr WHERE ad_state = 'A'; 

以上区分大小写的查处排除了所有的分片,除了只按此分片扫描的 part0 ,其包含 'A''a'的行被存储。

有关具有 NLSCASE INSENSITIVE 属性的数据库的更多信息,请参阅 CREATE DATABASE 语句在 NLSCASE INSENSITIVE 数据库中重复的行在区分大小写的数据库中的 NCHAR 和 NVARCHAR 表达式