南大通用GBase8s 常用SQL语句(八十一)

南大通用GBase8s 常用SQL语句(八十一)

使用 REMAINDER 关键字

使用 REMAINDER 关键字来指定存储超出指定表达式的有效值的存储空间。如果不指定 remainder ,并且在一行中插入或更新不符合任何分片定义的值,则数据库服务器将返回一个错误。

下列示例使用仲裁规则为 c1 列的特定值定义五个分片,以及另一个可以接受所有值的分片:

CREATE TABLE T1 (c1 INT) FRAGMENT BY EXPRESSION

        PARTITION PART_1 (c1 = 10) IN dbs1,

        PARTITION PART_2 (c1 = 20) IN dbs1,

        PARTITION PART_3 (c1 = 30) IN dbs1,

        PARTITION PART_4 (c1 = 40) IN dbs2,  

        PARTITION PART_5 (c1 = 50) IN dbs2,

        PARTITION PART_6 REMAINDER IN dbs2;

此处,前面三个分片存储在 dbs1 dbspace 的分区中,其它分片,包括 remainder ,都存储在 dbs2 dbspace 的分区中。此示例需要有显式的分片名,因为每个 dbspace 都有多个分区。

通过 LIST 分片

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

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

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

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

  1. 表及其索引都可以通过 LIST 分片。
  2. 分片键可以是基于单列或多列的列表达式。
  3. 该列表可以可选地包含 remainder 分片。
  4. 该列表可以可选地包含只存储 NULL 值的 NULL 分片。

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

  1. 包含 NULL (或 IS NULL)的列表不能包含其它值。
  2. 分片键必须基于单行。
  3. 分片键必须是列表达式。该常量表达式可基于单列或多列。
  4. 列表不能包含重复的常量表达式值。每个值在 FRAGMENT BY LIST 子句中必须是唯一的。

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

  1. 行的分片键计算为 NULL ,但是 FRAGMENT BY LIST 子句定义的为非 NULL 值。
  2. 行的分片键符合对任何分片都是非常量表达式值的条件,但是没有定义 remainder 分片。

以下是通过 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 表达式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值