Rolling Window 子句

使用 Rolling Window 子句来定义表或它的索引的范围分片分布存储策略,并定义清除策略以拆离过剩的分片。就像其它具有范围间隔分片的表一样,每个 rolling window table 的新的间隔分片是通过数据库服务器自动创建地,以用来存储超出当前分片范围的分片键值的新行。当分片的集合超出清除策略针对分片的数量或针对所分配的存储大小定义的用户定义的 "window" 之后,数据库服务器标识并拆离来自数据库中所有的滚动窗口表的过剩分片。缺省情况下,它们的清除策略作为调度程序的日常任务而强制执行。

CREATE TABLE 的 Rolling Window 子句支持下列语法:
Rolling Window 子句
Rolling Window (no size limit)
Rolling Window (with size limit)
元素 描述 限制 语法
quantity 滚动间隔分片的最大数量 必须是大于零的整数。用户定义的范围分片不包含在此限制内。 字符整数
size 表的总存储大小的上限 必须大于零 字符整数
units 表的总质量存储的缩写单位 必须是 KKBKiBMMBMiBGGBGiBTTBTiB (或者这些字符的小写)。尾随任何字符都会导致语法错误。 不带引号的字符串

用法

INTERVAL 分片子句可启用新分片基于间隔分片表达式的自动创建功能。不像一般的范围间隔分布存储,它创建新的分片,但不提供对随着时间增长表的大小的管理,Rolling Window 选项定义间隔分片的当前数量的上限,或为表和其索引分配的总存储的大小或者这两者限制。在超过这些限制后,数据库服务器自动归档或销毁 Rolling Window 子句标识为超出的分片,并用基于 Rolling Window 子句定义的清除策略的新的间隔分片替换它们。

范围间隔分布存储策略包含 Rolling Window 子句的表称为 rolling window tables。数据库服务器为 Rolling Window 表创建的间隔分片称为 滚动分片

与启用 AUTOLOCATE 配置参数或会话环境设置创建的表的循环分片不同,本子句定义的滚动分片的动态 "window" 可以支持查询中的分片消除,其中 numeric 、DATE 和 DATETIME 表达式中的分片键值与查询谓词相关。滚动窗口表的另一个效率是当计划程序通过运行 purge_tables 任务强制执行清除策略时自动归档或销毁过多的碎片。

Rolling Window 子句定义自动从表中删除现有分片的以下任一条件或两个条件:
  • ROLLING FRAGMENTS 关键字指定了表的间隔分片数量可以同时存在的限制。
  • LIMIT TO 关键字为分配给表及其索引的总存储空间指定了限制。

当超过其中之一的限制时,超出时间间隔的分片将被数据库服务器自动销毁或拆离,如分别使用 DISCARD 或 DETACH 关键字指定。这些规范定义了表的清除策略。此策略通过定义自动删除现有分片的标准以及自动替换这些分片以插入新数据记录的新空分片来限制表可以存储多少数据。

滚动窗口表的清除策略

Rolling Window 子句为此表定义清除策略。 此清除策略通过定义自动拆离表分片的条件,在表达到滚动分片数量的用户指定的限制或分配的存储的总大小后,限制表可以存储多少数据。当启用清除策略时,数据库服务器自动用新的空的分片替换已拆离的分片以插入新的数据记录。

当达到清除策略的限制后,拆离分片的数量取决于定义此限制的关键字和定义此清除策略操作的关键字:
  • 对于使用 ROLLING INTERVALS 关键字指定分片数量限制,只会考虑间隔分片。它们按最低分片键值的顺序拆离,如系统目录中分片的 sysfragments.evalpos 值所示。

    此选择拆离间隔分片的行为等价于 INTERVAL FIRST 关键字使用 LIMIT TO 选项指定的行为。然而,ROLLING INTERVALS 选项不支持显式 INTERVAL FIRST 关键字,和任何在 DETACHDISCARD 清除规范之后随后的 LIMIT TO 选项关键字。

    ROLLING INTERVALS 选项还不提供拆离范围分片,因为 DETACHDISCARD 清除之后,没有保留的范围分片。出于此原因,包含范围分片作为 ROLLING INTERVALS 选项(Rolling Window 子句语法也不支持)不会减少驻留在表中的分片数量。

  • 对于使用 LIMIT TO 关键字指定已分配的存储大小限制,三个关键字选项可以指示拆离哪些分片:
    • 如果 ANY 关键字紧随在 DETACHDISCARD 关键字之后,则会拆离范围或间隔分片,从 sysfragments.evalpos 值最低的分片开始。清除策略指定 ANY 为拆离的分片时可以减少当前已分配存储的大小,但是如上所述,拆离范围分片不会减少分片的总数。
    • 如果指定 INTERVAL ONLY 关键字,那么只拆离间隔分片,也是从 sysfragments.evalpos 值最低的分片开始。

      如果不存在间隔分片,则数据库服务器不会满足 LIMIT 子句的限制。如果该项发生在现有的滚动窗口表中,您必须考虑使用 ALTER FRAGMENT MODIFY INTERVAL 语句更改清除策略,以致于范围分片可以被拆离。可以通过将 INTERVAL ONLY 关键字替换为 ANY or INTERVAL FIRST 关键字来实现。反之如果您的存储策略支持较大的大小限制,则您可以使用 ALTER FRAGMENT 添加 LIMIT TO size 值。

    • 如果 INTERVAL FIRST 关键字紧跟着 DETACHDISCARD 关键字,则数据库服务器首先拆离间隔分片,从最低的 sysfragments.evalpos 值开始,直到满足分配的存储大小需求。

    如果 Rolling Window 子句包含 LIMIT TO 关键字,但是没有上面的选项中的分片被拆离,那么缺省情况下 INTERVAL FIRST 策略决定拆离哪个分片。

    如果已经拆离了所有的间隔分片,而还没有填满存储大小限制,则作为安全措施,数据库服务器拆离范围分片,从最低值开始。在任何情况下,当范围分片被拆离或丢弃时,它们被新的空的分片代替以存储相同范围的值,因此该表的结构被保留。

对已清除的分片中的数据的处置

Rolling Window 子句提供两个关键字选项,DETACHDISCARD ,用于自动主力滚动窗口表的已拆离的分片。这里对此关键字的选择没有缺省值。如果 Rolling Window 子句没有包含 DETACHDISCARD 关键字则数据库服务器返回错误。
  • 使用 DETACH 将分片与数据库服务器自动创建的独立的表建立连接,且表并标识符是这种格式:
    < original_table_name >_< lower value >_< higher value >

    此处的 lower_valuehigher_value 是该分片被拆离之间间隔范围的最小值和最大值。

    如果表的名称已经存在,则会在 higher_value 之后附加一个数字计数,第一个附加表从 _1 开始:
    < original_table_name >_< lower value >_< higher value >_1 
    等等等等,用 _2 附加到下一个表名称(或者如果附加 _2 不能产生一个唯一的表名称,则附加更多的整数)。
  • 使用 DISCARD 销毁已拆离的分片。

    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 语句以多种方法更改此策略,包括:
  • 更改 ROLLING FRAGMENTSLIMIT TO 规范,
  • 替换清除策略的 DETACHDISCARD 关键字
  • 使用 DISABLE 关键字选项终止清除策略
  • 通过 ENABLE 关键字重新启用一个已终止的清除策略
  • 移除该清除策略和滚动窗口表的滚动分片

要将滚动分布存储策略更改为简单的范围间隔分片策略,您可以为此表运行 ALTER FRAGMENT MODIFY INTERVAL DROP ALL ROLLING 语句。如果您要保留这些数据,则在做此操作之前首先归档表的非空滚动间隔分片中的行。

滚动窗口表的限制

使用 ROLLING INTERVALSLIMIT TO 关键字定义滚动窗口分片策略的表,和其清除策略具有以下限制:
  • Rolling Window 子句为滚动窗口分片定义的清除策略需要数据库服务器在满足 DETACHDISCARD标准的分片上执行 ALTER FRAGMENT DETACH 操作。 具有被启用的外键约束引用主键的列的表或具有 ROWID 的表不允许 ALTER FRAGMENT DETACH 语句。出于此原因,CREATE TABLE 和 ALTER FRAGMENT MODIFY INTERVAL 语句不能在具有主键约束或 ROWID 影子列的表上定义分片清除策略。
  • 任何定义在滚动窗口表上的索引都必须具有与滚动窗口表相同的存储分布。
  • 只有具有 DBA 存取权限的用户才能调用实现拆离滚动分片的 DETACHDISCARD 选项的例程。 具有 RESOURCE 存取权限的用户可以执行 syspurge( ) 函数,但是只能对您自己所拥有的表执行清除策略。
  • 数据库服务器会静默地忽略高可用数据复制(HDR)集群环境中辅助服务器上任何 syspurge( ) 函数的调用。这是因为集群环境不会复制滚动窗口清除策略核心中 DETACHDISCARD 选项触发的 ALTER FRAGMENT 更改。
  • 同样,在 grid 环境中,不会执行复制表行清除策略。

没有存储大小限制的滚动窗口表

以下 CREATE TABLE 语句的示例定义了一个范围间隔分片存储策略,包括把 p4 作为 NULL 分片以存储 order_date 分片键列值为 NULL 的行。因为此分片键的范围内的间隔定义为一个月,且分片过渡值是 2014 的第一天,则当具有比 2013 年晚一年内插入 order_date 值的记录时,会生成第一个间隔分片。连续的间隔分片将会以循环的形式存储在 dbspaces dbs1dbs2dbs3 中:

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 dbs1dbs2dbs3 中:

    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;
 
这里的 Rolling Window 子句将滚动间隔分片的最大数量设置为 10 。除非以下任一事件发生否则此清除策略将不会强制执行:

如果在存储大小限制之前 10 滚动间隔的限制已经超出,则数据库服务器将会在 11 个滚动分片中拆离 evalpos 值最小的间隔分片。

如果超过 100000 兆字节超过了数量的限制,则 DETACH ANY 选项运行数据库服务器选择任何范围分片或间隔分片以拆离。

在任一情况下,此分片将被附加到另一个表,而不是被销毁,因为清除策略指定了 DETACH ,而不是 DISCARD

1 该路径只能使用一次