用户定义的范围分片
在 Interval Fragment 子句中必须定义至少一个范围分片。声明每个分片需要这些元素:
l PARTITION 关键字,后面跟随您为此分片生成的名称。表的其它分片不能具有相同的名称。
l VALUES 值,后跟具有以下其中其中之一格式的 Boolean 表达式:
小于( < )关系运算符和范围表达式,它定义可以存储在分片中分片键值的上限
IS NULL 运算符。如果分片键采用 NULL 值,您可以使用此运算符定义 NULL 分片,该分片只存储将 NULL 作为其分片键值的行。
只能定义一个 IS NULL 运算符分片。NULL 分片并不是必需的,但是如果 NULL 分片不存在,而用户尝试插入分片键列为 NULL 的行时,数据库服务器返回错误。
l IN 关键字,后跟存储该分片的 dbspace 的名称。它可以还是 STORE IN 规范引用的 dbspace ,或者不在 STORE IN 列表中包含的 dbspace 。
如果范围分片没有按升序顺序定义,则数据库服务器按升序顺序存储它们,因此在第一个初始位置的分片具有最小的上限范围。
在相同的 Interval Fragment 子句中的两个分片不能具有相同的上限。 PARTITION 规范中定义的范围分片不能重叠。如果(intvl_valexpr)大小规范在 INTERVAL 关键字之后, 那么如果定义连续范围分片的范围表达式之间的差异与 INTERVAL 大小规范不同,则数据库服务器发出错误。
NULL 分片并非必需,但如果用户尝试擦汗荣分片键值是 NULL 的行,而不存在 NULL 分片时,数据库服务器返回错误。
重要:
dbschema -ss 命令的输出显示了通过范围间隔分布方案分片的表的结构,该方案只返回用户在 CREATE TABLE 或 ALTER FRAGMENT 语句中的定义的范围分片。
此情况同样对于 dbexport -ss 命令的输出同样为真。
系统生成的间隔分片
当您使用 Interval Fragment 子句定义表或索引的范围分片时,不需要知道分片键值的全部范围。当插入一个不适合范围分片或间隔分片的行是,数据库服务器自动创建新的间隔分片来存储该行(基于间隔 intvl_valexp,不用 DBA 干预)。
表或索引的间隔分区的系统生成的名称是 sys_evalpos,evalpos 是系统目录中的此分片 sysfragments.evalpos 条目。如果表和它的索引使用相同的范围间隔分片策略,每个系统生成的索引分片将具有与该表的系统生成的分片相同的标识符。
这些自动生成的分片对应于包括新数据值的分片键范围的部分。如果在两个连续分片之间大于 intvl_valexp 范围的一部分不包含行,则间隙可以自动生成间隔分片。但是,在您在 Interval Fragment 子句中显式定义的分片之间是不允许间隙的。
如果未指定 intvl_valexp 表达式,则在 Interval Fragment 子句中显式定义的范围分片可用于存储在其范围间隔内具有对应分片键值的行,以及在禁用 ALTER FRAGMENT 以及之前生成的任何现有间隔分片自动创建间隔分片。然而,在这两种情况中,禁用自动创建新分片。如果用户尝试插入分片键值不在现有分片范围内的行,则数据库服务器发出错误 -772,并插入失败。
如上所述,dbschema -ss 和 dbexport -ss 命令显示按范围间隔分片的表的模式的输出仅包括用户定义的范围分片。在输出显示中不会显示系统生成的间隔分片。
但是,当从 dbexport 数据文件加载数据记录时,数据库服务器自动创建额外的间隔分片,
l 基于范围分片和间隔过渡分片,
l 和插入的行中的分片键值,
l 以及 Interval Fragment 子句的其它存储规范,注册于系统目录中。
范围间隔分片的示例
以下示例使用 INT 列 cust_id 的值作为数字分片键,并定义了四个范围分片。数据库服务器将为 cust_id 值超过 7999999 的插入行创建间隔大小是 1000000 的间隔发分片:
CREATE TABLE customer (cust_id INT, name CHAR (128), street CHAR (1024),
state CHAR (2), zipcode CHAR (5), phone CHAR (12))
FRAGMENT BY RANGE (cust_id)
INTERVAL (1000000) STORE IN (dbs2, dbs1)
PARTITION p0 VALUES < 2000000 IN dbs1,
PARTITION p1 VALUES < 4000000 IN dbs1,
PARTITION p2 VALUES < 6000000 IN dbs2,
PARTITION p3 VALUES < 8000000 IN dbs3;
在以下 DATETIME 分片键示例中,如果 dt1 列的值超过 VALUES 子句指定的范围分片的界限,则将在 25 年间隔中在 2005 年之后的 dbs1 dbspace 中创建间隔分片:
CREATE TABLE t1 (c1 int, d1 date, dt1 DATETIME YEAR TO FRACTION)
FRAGMENT BY RANGE (dt1) INTERVAL (INTERVAL(25) YEAR(2) TO YEAR)
PARTITION p1 VALUES <
DATETIME(2006-01-01 00:00:00.00000) YEAR TO FRACTION(5) IN dbs1;
在下一个示例中,DATE 列 order_date 的值是分片键,并且定义了四个范围分片,包括 order_date 具有 NULL 值的行的 p4。对于 order_date 的年值晚于 2007 的插入行,将在 01/01/2008 之后的 1 个月内自动创建间隔分片,并在 dbs1 、dbs2 和 dbs3 dbspace 中创建连续分片:
CREATE TABLE orders (order_id INT, cust_id INT,
order_date DATE, order_desc CHAR (1024))
FRAGMENT BY RANGE (order_date)
INTERVAL (NUMTOYMINTERVAL (1,'MONTH')) STORE IN (dbs1, dbs2, dbs3)
PARTITION p0 VALUES < DATE ('01/01/2005') IN dbs1,
PARTITION p1 VALUES < DATE ('01/01/2006') IN dbs1,
PARTITION p2 VALUES < DATE ('01/01/2007') IN dbs2,
PARTITION p3 VALUES < DATE ('01/01/2008') IN dbs3,
PARTITION p4 VALUES IS NULL in dbs3;
下一个 DATE 分片键的示例与先前的示例类似,但是此处的间隔大小指定为 1.5 年。在 12/31/2009 之后,对于 order_date 值,将以 18 个月(1.5 年)的间隔创建间隔分片:
CREATE TABLE orders1 (order_id INT, cust_id INT, order_date DATE,
order_desc CHAR (1024))
FRAGMENT BY RANGE (order_date)
INTERVAL (NUMTOYMINTERVAL (1.5,'YEAR')) 000STORE IN (dbs1, dbs2, dbs3)
PARTITION p0 VALUES < DATE ('01/01/2004') IN dbs1,
PARTITION p1 VALUES < DATE ('01/01/2006') IN dbs1,
PARTITION p2 VALUES < DATE ('01/01/2008') IN dbs2,
PARTITION p3 VALUES < DATE ('01/01/2010') IN dbs3;
如果 order_date 值丢失,则不能将行插入 orders1 表。因为没有定义非 NULL 分片。有关向现有使用范围间隔分片的表中添加 NULL 分片的语法,请参阅 ALTER FRAGMENT 语句的 ADD 子r句主题。
· Rolling Window 子句
使用 Rolling Window 子句来定义表或它的索引的范围分片分布存储策略,并定义清除策略以拆离过剩的分片。就像其它具有范围间隔分片的表一样,每个 rolling window table 的新的间隔分片是通过数据库服务器自动创建地,以用来存储超出当前分片范围的分片键值的新行。当分片的集合超出清除策略针对分片的数量或针对所分配的存储大小定义的用户定义的 "window" 之后,数据库服务器标识并拆离来自数据库中所有的滚动窗口表的过剩分片。缺省情况下,它们的清除策略作为调度程序的日常任务而强制执行。




