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

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

FRAGMENT BY 子句

使用 FRAGMENT BY 子句创建分片表并指定它的存储分布方案。PARTITION BY 关键字是 FRAGMENT BY 的同义词。

表的 FRAGMENT BY 子句

 

元素

描述

限制

语法

column

应用分片存储策略的列

必须是表中的列

标识符

dbspace

存储表分片的 Dbspace

最多可以指定 2,048 个 dbspaces。所有存储分片的 dbspaces 必须具有相同的页大小。

标识符

fragment _key

表列上的强制转型、列或函数表达式。这是在已分片的表上的表达式。

列只能来源于当前表。

表达式

partition

此处为分片声明的名称

在该表的分片名称中必须是唯一的

标识符

当您分片表时,存储表分片的存储空间名跟在 IN 关键字的后面。

使用 WITH ROWIDS 选项

未分片的表包含名为 rowid 的隐藏列,但是缺省情况下,分片表没有 rowid 列。可以使用 WITH ROWIDS 关键字向已分片表中添加 rowid 列。每行将自动分配一个唯一的 rowid 值,该行存在时这个值将一直保持不变,这样数据库服务器就可以使用该值来查找行的物理位置。每行需要额外的四个字节来存储 rowid 。

重要 不推荐使用此功能。请使用主键作为存取方法,而不要使用 rowid 列。

无法对类型表使用 WITH ROWIDS 子句。

通过 ROUND ROBIN 分片

在循环分布方案中,至少指定两个您希望放置分片的 dbspace 或分区。当记录被插入表中时,它们被放置在第一个可用的分片中。当您插入记录并按照分片总是保持大致相同的行数的方式分布行时,数据库服务器将在指定的分片中平衡负载。在该分布方案中,如果数据库服务器查找某行则它必须扫描所有的分片。

重要: 

FRAGMENT BY ROUND ROBIN 子句重写表的自动定位和分片,当 AUTOLOCATE 配置参数或 AUTOLOCATE 环境变量设置成正整数时,启用此功能。

当启用自动定位和分片时,则数据库服务器会自动决定

  1. 表 extent 大小,
  2. 存储分片的 dbspaces ,
  3. 新表的 ROUND ROBIN 分布存储策略。

大对象数据类型的循环分片存储

对于包含 BYTE 或 TEXT 列的表中的简单大对象,您可以通过设置 PN_STAGEBLOB_THRESHOLD 配置参数来为插入 BYTE 和 TEXT列保留空间。有关数据库服务器如何在循环分布分片中 stage 简单大对象的信息,请参阅 GBase 8s 管理员参考手册 中 PN_STAGEBLOB_THRESHOLD 的描述。

对于包含 BLOB 或 CLOB 列的表中的智能大对象,您可使用 PUT 子句在 sbspace 列表中指定循环分布存储。当您在 CREATE TABLE 语句(或 CREATE TEMP TABLE 语句或 ALTER TABLE 语句 )中包含 PUT 子句时,您可以包含或不包含为同一表上其它列定义分布存储的 FRAGMENT BY 子句的选项。PUT 子句只对指定多个 sbspace 的智能大对象应用循环存储分布策略。有关更多信息和示例,请参阅 PUT 子句。

通过 EXPRESSION 分片

基于表达式的分布方案中,规则中的每个分片表达式都指定了一个存储空间。规则中的每个分片表达式将数据隔离起来并帮助数据库服务器查找这些行。

要通过表达式对表分片,请指定以下规则之一:

  • 范围规则

范围规则指定使用范围的分片表达式来指定在分片中放置哪些行,如以下示例所示:

FRAGMENT BY EXPRESSION c1 < 100 IN dbsp1,

          c1 >= 100 AND c1 < 200 IN dbsp2, c1 >= 200 IN dbsp3;

  • 仲裁规则

仲裁规则根据预先定义的 SQL 表达式来指定分片表达式,该表达式通常使用 OR 子句将数据分组,如以下示例所示:

FRAGMENT BY EXPRESSION

              zip_num = 95228 OR zip_num = 95443 IN dbsp2,

              zip_num = 91120 OR zip_num = 92310 IN dbsp4,

              REMAINDER IN dbsp5;

警告: 请参阅日志记录选项这一节中关于 DBCENTURY 环境变量和分片表达式中数据值的说明。

在具有 NLSCASE INSENSITIVE 属性的数据库中,对 NCHAR 和 NVARCHAR 数据的操作会忽略字符大小写,从而数据库服务将由相同序列字母组成的大小写变化的字符串视为重复的值。如果通过表达式分片的表的分片键是 NCHAR 或 NVARCHAR 列,则通过字符表达式定义的每个分片将存储符合定义分片的表达式的所有大小写不同的变量。例如,对于表达式 lname = 'Garcia' ,其中 lname 是 NCHAR 或 NVARCHAR 类型的列,在该列中具有下列值的行将被存储在相同的分片中。 因为对于这些(并相似)字符串值字符大小写表达式是等价的:

'Garcia' 'garcia' 'GARCIA' 'GarCia' 'gARCia'

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

分片表达式中的用户定义的函数

对于包含用户定义的数据类型的行,您可以使用比较条件或用户定义的函数来定义范围规则。在以下示例中,比较条件为包含不透明数据类型的 long1 列定义了范围规则:

FRAGMENT BY EXPRESSION

        long1 < '3001' IN dbsp1,

        long1 BETWEEN '3001' AND '6000' IN dbsp2,

        long1 > '6000' IN dbsp3;

隐式的、用户定义的强制转型将 3001 和 6000 转换为不透明类型。

此外,您还可以使用用户定义的函数为 long1 列的不透明数据类型定义范围规则:

FRAGMENT BY EXPRESSION

        (lessthan(long1,'3001')) IN dbsp1,

        (greaterthanorequal(long1,'3001') AND

        lessthanorequal(long1,'6000')) IN dbsp2,

        (greaterthan(long1,'6000')) IN dbsp3;

如前面的示例所示,显式的用户定义的函数需要在 IN 子句前的整个分片表达式周围加上括号。

可以用 SPL 或 C 或 Java™ 语言来编写分片表达式中用户定义的函数。这些函数必须满足四个要求:

  1. 必须能对 Boolean 值求值。
  2. 它们必须是不可变的。
  3. 它们必须驻留在相同数据库的同一表中。
  4. 它们不得生成 OUT 或 INOUT 参数。

有关如何为分片表达式创建 UDR 的信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指南

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值