使用 Rolling Window 子句来定义表或它的索引的范围分片分布存储策略,并定义清除策略以拆离过剩的分片。就像其它具有范围间隔分片的表一样,每个 rolling window table 的新的间隔分片是通过数据库服务器自动创建地,以用来存储超出当前分片范围的分片键值的新行。当分片的集合超出清除策略针对分片的数量或针对所分配的存储大小定义的用户定义的 "window" 之后,数据库服务器标识并拆离来自数据库中所有的滚动窗口表的过剩分片。缺省情况下,它们的清除策略作为调度程序的日常任务而强制执行。
元素 | 描述 | 限制 | 语法 |
---|---|---|---|
quantity | 滚动间隔分片的最大数量 | 必须是大于零的整数。用户定义的范围分片不包含在此限制内。 | 字符整数 |
size | 表的总存储大小的上限 | 必须大于零 | 字符整数 |
units | 表的总质量存储的缩写单位 | 必须是 K 、KB 、KiB 、M 、MB 、MiB 、G 、GB 、GiB 、T 、TB 、TiB (或者这些字符的小写)。尾随任何字符都会导致语法错误。 | 不带引号的字符串 |
INTERVAL 分片子句可启用新分片基于间隔分片表达式的自动创建功能。不像一般的范围间隔分布存储,它创建新的分片,但不提供对随着时间增长表的大小的管理,Rolling Window 选项定义间隔分片的当前数量的上限,或为表和其索引分配的总存储的大小或者这两者限制。在超过这些限制后,数据库服务器自动归档或销毁 Rolling Window 子句标识为超出的分片,并用基于 Rolling Window 子句定义的清除策略的新的间隔分片替换它们。
范围间隔分布存储策略包含 Rolling Window 子句的表称为 rolling window tables。数据库服务器为 Rolling Window 表创建的间隔分片称为 滚动分片 。
与启用 AUTOLOCATE 配置参数或会话环境设置创建的表的循环分片不同,本子句定义的滚动分片的动态 "window" 可以支持查询中的分片消除,其中 numeric 、DATE 和 DATETIME 表达式中的分片键值与查询谓词相关。滚动窗口表的另一个效率是当计划程序通过运行 purge_tables 任务强制执行清除策略时自动归档或销毁过多的碎片。
当超过其中之一的限制时,超出时间间隔的分片将被数据库服务器自动销毁或拆离,如分别使用 DISCARD 或 DETACH 关键字指定。这些规范定义了表的清除策略。此策略通过定义自动删除现有分片的标准以及自动替换这些分片以插入新数据记录的新空分片来限制表可以存储多少数据。
Rolling Window 子句为此表定义清除策略。 此清除策略通过定义自动拆离表分片的条件,在表达到滚动分片数量的用户指定的限制或分配的存储的总大小后,限制表可以存储多少数据。当启用清除策略时,数据库服务器自动用新的空的分片替换已拆离的分片以插入新的数据记录。
此选择拆离间隔分片的行为等价于 INTERVAL FIRST 关键字使用 LIMIT TO 选项指定的行为。然而,ROLLING INTERVALS 选项不支持显式 INTERVAL FIRST 关键字,和任何在 DETACH 或 DISCARD 清除规范之后随后的 LIMIT TO 选项关键字。
ROLLING INTERVALS 选项还不提供拆离范围分片,因为 DETACH 或 DISCARD 清除之后,没有保留的范围分片。出于此原因,包含范围分片作为 ROLLING INTERVALS 选项(Rolling Window 子句语法也不支持)不会减少驻留在表中的分片数量。
如果不存在间隔分片,则数据库服务器不会满足 LIMIT 子句的限制。如果该项发生在现有的滚动窗口表中,您必须考虑使用 ALTER FRAGMENT MODIFY INTERVAL 语句更改清除策略,以致于范围分片可以被拆离。可以通过将 INTERVAL ONLY 关键字替换为 ANY or INTERVAL FIRST 关键字来实现。反之如果您的存储策略支持较大的大小限制,则您可以使用 ALTER FRAGMENT 添加 LIMIT TO size 值。
如果 Rolling Window 子句包含 LIMIT TO 关键字,但是没有上面的选项中的分片被拆离,那么缺省情况下 INTERVAL FIRST 策略决定拆离哪个分片。
如果已经拆离了所有的间隔分片,而还没有填满存储大小限制,则作为安全措施,数据库服务器拆离范围分片,从最低值开始。在任何情况下,当范围分片被拆离或丢弃时,它们被新的空的分片代替以存储相同范围的值,因此该表的结构被保留。
< original_table_name >_< lower value >_< higher value >
此处的 lower_value 和 higher_value 是该分片被拆离之间间隔范围的最小值和最大值。
< original_table_name >_< lower value >_< higher value >_1等等等等,用 _2 附加到下一个表名称(或者如果附加 _2 不能产生一个唯一的表名称,则附加更多的整数)。
DISCARD 关键字指定删除已经成功拆离的分片,以致于当执行清除策略时,不需要的数据记录会及时移除。通过这种方法,过渡分片的数量或滚动窗口表的存储空间总量会约束到规定值。
这些配置选项旨在自动化由范围间隔分片的表的空间管理,以致于不需要的数据记录会及时移除,且存储空间被包含到规定量。丢弃数据的另一种方法是拆离分片。这提供了从不正确指定的清除策略恢复的机会,并允许将清除的分片(或者它们的数据被移动)附加到归档。
在具有有限存储的数据库中,插入新行的 DML 或加载操作(包括插入超出现有分片的范围行)可能导致分配的存储大小或超过 Rolling Window 子句为一个或多个滚动窗口表指定的限制的间隔分片的数量。
但是,在它的界限超出的那一刻,不会立即执行 Rolling window 表的清除策略。
清除策略被设计为在移除和处理滚动窗口表表的分片的所需的 ALTER FRAGMENT DETACH 和 ALTER FRAGMENT ATTACH 操作不可能与并发用户的访问尝试冲突时作为调度任务每天强制执行。缺省情况下,清除策略会在每天本地时间 00:45 执行。有关更多信息,请参阅 GBase 8s 管理员指南 中 Scheduler 的内置 purge_tables 任务的描述。
清除策略也可以通过运行 syspurge( ) 系统函数来强制执行。在 DBA 调用此函数之后,数据库服务器检测系统目录,并标识清除策略已经超出的滚动窗口表。然后数据库服务器按照清除策略的指定丢弃或拆离、限定滚动分片直到满足清除策略,或者直到没有更多的滚动分片能移除。syspurge( ) 函数不需要参数,但是接受启用联机日志诊断的可选参数。
可以使用 ALTER FRAGMENT 语句更改或删除滚动窗口表的清除策略。或将创建时具有其它存储选项的表更改为滚动窗口表。例如,简单地通过添加清除策略, ALTER FRAGMENT 语句的 Rolling Window 子句可将使用简单范围间隔分片的表更改为滚动窗口表。
CREATE TABLE 语句的 Rolling Window 子句支持 ALTER FRAGMENT ON TABLE . . . MODIFY INTERVAL 语句中的 Rolling Window 子句语法的子集。
要将滚动分布存储策略更改为简单的范围间隔分片策略,您可以为此表运行 ALTER FRAGMENT MODIFY INTERVAL DROP ALL ROLLING 语句。如果您要保留这些数据,则在做此操作之前首先归档表的非空滚动间隔分片中的行。
以下 CREATE TABLE 语句的示例定义了一个范围间隔分片存储策略,包括把 p4 作为 NULL 分片以存储 order_date 分片键列值为 NULL 的行。因为此分片键的范围内的间隔定义为一个月,且分片过渡值是 2014 的第一天,则当具有比 2013 年晚一年内插入 order_date 值的记录时,会生成第一个间隔分片。连续的间隔分片将会以循环的形式存储在 dbspaces dbs1 、dbs2 和 dbs3 中:
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')) ROLLING (3 FRAGMENTS) DETACH STORE IN (dbs1, dbs2, dbs3) PARTITION p0 VALUES < DATE ('01/01/2014') IN dbs1, PARTITION p4 VALUES IS NULL in dbs3;
在以上示例中,Rolling Window 子句将滚动间隔分片的最大数量设置为 3 。如果在 2014 年前三个月的每一个中添加行,则在该年的三月将生成三个滚动分片,因为每个新的间隔分片仅存储一个月的数据。如果在 4 月创建了第 4 个时间间隔分片,这将超过滚动分片上的清除策略限制。由于未指定存储大小限制,因此默认的 INTERVAL FIRST 标准将拆离四个滚动分片中其 evalpos 值最小的间隔分片。该分片将附加到另一个表中,而不是销毁,因为清除策略指定 DETACH,而不是 DISCARD。
对于 employee 表,以下范围间隔分布式存储策略使用 INTEGER 列 emp_id 中的值作为主键列,1000 是滚动间隔分片的此分片键范围内的间隔。在三个范围分片中,最后一个具有 20000 的间隔跃迁值,这意味着当插入 emp_id 值为 20002 或更大时,将生成第一个滚动间隔分片。滚动间隔分片将再次以循环方式存储在 dbspaces dbs1 、dbs2 和 dbs3 中:
CREATE TABLE employee (emp_id INTEGER, emp_name CHAR(64), ssn CHAR(12), basepay FLOAT, varpay FLOAT, dept_id SMALLINT, hire_date DATE) FRAGMENT BY RANGE(emp_id) INTERVAL(1000) ROLLING ( 10 FRAGMENTS ) LIMIT TO 100000MiB DETACH ANY STORE IN (dbs1, dbs2, dbs3) PARTITION p1 VALUES < 5000 IN dbs0, PARTITION p2 VALUES < 10000 IN dbs0, PARTITION p3 VALUES < 20000 IN dbs4;
如果在存储大小限制之前 10 滚动间隔的限制已经超出,则数据库服务器将会在 11 个滚动分片中拆离 evalpos 值最小的间隔分片。
如果超过 100000 兆字节超过了数量的限制,则 DETACH ANY 选项运行数据库服务器选择任何范围分片或间隔分片以拆离。
在任一情况下,此分片将被附加到另一个表,而不是被销毁,因为清除策略指定了 DETACH ,而不是 DISCARD 。