ITPub博客

首页 > 数据库 > 国内数据库 > 南大通用GBase8s SQL常用SQL语句(九)

南大通用GBase8s SQL常用SQL语句(九)

原创 国内数据库 作者:飞天小气球 时间:2021-08-23 13:52:17 0 删除 编辑

 

Rolling Window 子句

可以使用 ALTER FRAGMENT ON TABLE . . . MODIFY INTERVAL 语句的 Rolling Window 子句来修改或删除一个滚动参考表的现有清除策略。该子句也可以将不具有分布存储策略或不具有范围区间策略或具有范围区间策略(没有清除策略)的表更改为滚动窗口表。

语法

ALTER FRAGMENT 语句的 Rolling Window 子句支持以下语法。

ALTER FRAGMENT Rolling Window 子句

1: 删除所有滚动间隔分片

 

2: 限制最大分配存储大小

 

3: 只限制间隔分片的数量

 

元素

描述

限制

语法

quantity

滚动的区间分片的最大数

必须是比零打的整数。用户定义的分片不在此限制内。

整型字符

size

分配给表和它的索引的存储的上限

必须比零大

整型字符

units

表的总存储量的单位的简写

必须是 K  、 KB  、 KiB  、 M  、 MB  、 MiB  、 G  、 GB  、 GiB  、 T  、 TB  、 TiB (或这些字符的小写)。任何尾随字符会导致语法错误。

以字母 K  、 M  、 G  或 T 开头的不带引号的字符串

用法

ALTER FRAGMENT MODIFY INTERVAL 语句中的 Rolling Window 子句的语法支持之前 CREATE TABLE FRAGMENT BY INTERVAL 语句中的 Rolling Window 子句的语法。

修改滚动窗口表

ALTER FRAGMENT MODIFY INTERVAL 语句的 Rolling Window 子句类似于它的语法,但是它不等同于 CREATE TABLE 语句的 Rolling Window 子句。 ALTER FRAGMENT Rolling Window 子句支持以下功能:

您可以为使用范围区间分片的表定义清除策略。

您可以按下列变更修改现有清除策略:

更改 quantity   ROLLING FRAGMENTS  

更改 size   LIMIT TO  

DETACH   DISCARD   关键字替换 DETACH   DISCARD   关键字。

替换 ANY   INTERVAL FIRST   INTERVAL ONLY   关键字选项。

如果您删除 ANY   INTERVAL FIRST   INTERVAL ONLY   关键字规范而没有替换,缺省的清除策略操作是 INTERVAL FIRST 。(有关更多信息,请参阅 Interval fragment 子句 。)

您可以指定 INTERVAL DISABLED   关键字禁用滚动窗口表的区间分片,从而中止它的清除策略。

您可以指定 INTERVAL ENABLED   关键字恢复一个表的区间分片(并重启此清除策略)。该表的区间分片和创建和滚动分片的归档和重建已被禁用。

您可以指定 DROP ALL ROLLING   关键字来去除现有的清除策略。其结果是将滚动参考表更改为按区间分片的表。

如果您打算暂时中止当前的清除策略,再随后恢复该相同的清除策略,则应该使用 INTERVAL DISABLED   关键字而不是 DROP ALL ROLLING   关键字。

强制执行清除策略

当已分配的总存储大小或区间分片的总量超出 Rolling Window 子句指定的限制时,滚动窗口表的清除策略不会立即强制执行。

清除策略被设计为在滚动窗口表的分片上的所需 DETACH ATTACH 操作不可能与并发用户的访问尝试冲突时作为 Scheduler 任务每天强制执行。缺省情况下,清除策略会每天的本地时间 00:45 时强制执行。有关更多信息,请参阅 GBase 8s 管理员指南   中的 Scheduler 的内置的 purge_tables 任务。

清除策略也可以通过执行 syspurge() 系统函数而手动强制执行。在 DBA 调用 syspurge() 函数之后,数据库服务器会检查系统目录,并标识任何清除策略已超出的滚动窗口表。然后数据库服务器会按照清除策略指定丢弃或拆离合格的滚动分片直到满足此清除策略,或直到没有可移除的滚动分片。 syspurge() 函数不需要参数,但是接受可启用联机日志诊断的可选参数。

只有具有 DBA 存取权限的用户才能调用实行 DETACH   DISCARD   选项以拆离滚动分片的例程。具有 RESOURCE 存取权限的用户可以执行 syspurge() 函数,但是这只能对它们所拥有的表的强制执行清除策略。

数据库服务器会默默地忽略 syspurge() 函数关于高可用数据复制集群( HDR )环境中的辅助服务器的调用。类似地,在 grid 环境下,不会强制执行已复制的表的清除策略。这是因为 grid 环境和集群环境不会复制 DETACH   DISCARD   选项触发的 ALTER FRAGMENT 更改,这是滚动窗口清除策略的核心。

Rolling Window 子句提供两个关键字选项以处理拆离的滚动区间分片:

使用 DETACH   将该分片连接到数据库服务器自动创建的非独立的表中,并且它们的表标识具有以下格式:

< original_table_name >_< lower value >_< higher value >

此处 lower_value   higher_value   是该分片在被拆离前,其范围区间的最小和最大值。

如果表的名称已存在,那么在 higher value 后附加一个数字计数器,以 _1   开始表示第一个附加表:

< original_table_name >_< lower value >_< higher value >_1

以此类推,将 _2   附加在下一个表的名称后(或附加一个更大的整数,如果附加 _2   没有产生唯一的表名称。)

使用 DISCARD 销毁已拆离的分片。

DISCARD   关键字指定删除已拆离的分片,因此当强制执行清除策略时,会及时地删除非必须的数据记录。通过这种方法,滚动分片的数量或滚动窗口表的存储空间总量会约束到规定值。

滚动窗口的限制

ALTER FRAGMENT MODIFY 语句无法使用 Rolling Window 子句将具有以下属性的表更改为滚动窗口表:

ROWID

一列或多列定义为一个参考约束的主键

已拆离的索引(即,一个索引存储分布方案与该表的分片存储策略不同)

类似地,ALTER TABLE 语句不能为滚动窗口表添加 ROWID 列或主键约束。

Rolling Window 子句为滚动窗口定义的清除策略要求数据库服务器在分片上执行的 ALTER FRAGMENT DETACH 操作必须满足 DETACH   DISCARD   标准。然而,对于包含由一个启动的外键约束引用的主键的表,或包含 ROWID 的表,不允许 ALTER FRAGMENT DETACH 语句。因此 CREATE TABLE and ALTER FRAGMENT ON TABLE . . . MODIFY INTERVAL 语句无法定义或修改具有主键约束或 ROWID 隐藏列表的清除策略。

滚动窗口表上定义的任何索引必须具有与该滚动窗口相同的范围区间存储分布。

使用 MODIFY INTERVAL TRANSITION 选项

您可以使用该选项添加有范围区间分片结构的表的最后一个范围分片的过渡值。此过渡值不会被使用 ALTER FRAGMENT 语句的 MODIFY INTERVAL TRANSITION 选项减少。

您不能使用 MODIFY 选项的 PARTITION partition  VALUES 语法修改一个使用范围区间存储分布方案的表的最后一个范围分片(也称为 transition fragment )的范围表达式。然而过渡值(此范围表达式的上限)会在使用 MODIFY INTERVAL TRANSITION TO 关键字指定新的上限时增加。当过渡值更改后不会有数据移动。

要减少过渡值(通过重置过渡分片范围的上限),您必须执行 ALTER FRAGMENT INIT   操作以重新定义该表的范围区间分布存储方案。

过渡值增加时自动重命名分片

指定 MODIFY INTERVAL TRANSITION ALTER FRAGMENT 语句会导致重命名现有的分片:

如果在新的和旧的过渡值之间没有区间分片,但是区间分片早已超出新的过渡值,系统生成的区间分片名称的最终的数字将按区间分片边界值除以新过渡值和旧过渡值之间的差额的值减少。

例如,如果区间值表达式定义了一个等于 20 的区间大小,且旧过渡值和新过渡值之间相差 60 ,那么名为 sys_p7 的区间分片将会被重命名为 sys_p4 ,因为它的商为 (60/20) = 3

如果在新的和旧的过渡值之间存在区间分片,那么字符 rg 会附加在它们的名称上以标识它们成为了范围分片,因为它们分片表达式的上限不再大于该表的过渡值。

例如 ,如果一个表插入的过渡值符合其区间分片 sys_p5  VALUES 值的上限,那么此分片将更改为范围分片,并重命名为 sys_p5rg   (它也是过渡分片)。如果另一个称为 sys_p4   的区间分片也有一个小于 VALUES 上限值在它的分片表达式中,那么此分片也会变为范围分片,并重命名为 sys_p4rg

在分片重命名操作过程中,当更新 sysfragments   系统目录表时,会在此分片上放置一个互斥锁。

partition   列中带有新分片标识符值,

对于任何区间分片或滚动分片(在当前 ALTER FRAGMENT MODIFY 操作过程中,滚动区间分片的在分片列表中的初始位置已变更的滚动区间分片)的 evalpos   列包含新的整型值。

在以上列出的情况中,一些分片被重命名以确保分片列表中的每个分片是唯一的,并保持为区间分片系统生成的名称和在系统目录中这些分片对应的 sysfragments.evalpos   值之间的相关性。(另见 自动重命名区间分片标识符 。)

以下的一些 ALTER FRAGMENT 示例会阐述该分片重命名行为。

ALTER FRAGMENT MODIFY INTERVAL TRANSITION 的示例

以下语句定义了一个使用范围区间春初分布方案的已分片的表 tabtrans   ,该表包含整型列 i   作为主键,和区间值 100   。过渡分片 p2   有过渡值 300   ,意味着数据库服务器将在对表的任何操作中定义一个新的区间分片以存储分片键值大于等于 300   的新行。

CREATE TABLE tabtrans (i INT, c CHAR(2))

        FRAGMENT BY RANGE (i)

        INTERVAL (100) STORE IN (dbs1, dbs2, dbs3)

        PARTITION p0 VALUES < 100 IN dbs0,

        PARTITION p1 VALUES < 200 IN dbs1,

        PARTITION p2 VALUES < 300 IN dbs0;  -- last range fragment (also

        -- called transition fragment)

以下示例基于此 tabtrans   表。

下列 ALTER FRAGMENT 语句试图将过渡分片值从 300   增加到 250  

ALTER FRAGMENT ON TABLE tabtrans

          MODIFY INTERVAL TRANSITION TO 250;

此语句失败,因为它试图减少该过渡值。如果目标是保持当前的区间值 100   ,但是对于新过渡值则变为 250   ,那么需要 ALTER FRAGMENT INIT 操作重新定义该范围分片。为了保持范围分片的边界对齐,该范紧接的过渡分片的范围分片的新上限值必须为 150 。在新的分布存储方案中,如果要插入分片键值大于 250   的行,那么数据库服务器会生成一个新的范围为 100   的区间分片,之前的整数值 50 (模 100 )作为上限 .

如果新的过渡值和旧过渡值之间没有区间分片,则数据库服务器更新最后一个范围分片的表达式为 VALUES < new new 是新过渡值):

INSERT INTO tabtrans VALUES (601, "BB");  -- creates interval fragment sys_p6               -- with fragment expression >= 600 AND < 700

tabtrans   表的分片列表和分片表达式变为以下:

  p0        VALUES < 100              - range fragment

p1        VALUES < 200              - range fragment

  p2        VALUES < 300              - last range (or transition) fragment

 sys_p6    VALUES >= 600 AND VALUES < 700 - interval fragment

此处,系统生成的新区间分片的名称是 sys_p6   ,因为 6   是系统目录中新分片的 sysfragments.evalpos   值。 evalpos   7   5   会被保留(还未创建)以便区间分片存储分片键符合分片表达式 VALUES >= 300 AND VALUES < 400  and VALUES >= 400 AND VALUES < 500   的行,根据表的当前过渡值和 FRAGMENT BY 子句中 INTERVAL (100)   规范定义了该表的分片方案。

在变更此过渡值的过程中,此分片被更改为不产生数据移动。以下语句成功地将过渡值更改为 500  

ALTER FRAGMENT ON TABLE tabtrans

          MODIFY INTERVAL TRANSITION TO 500;

旧过渡值是 300   新过渡值是 500 ,之间没有区间分片。第一个区间分片以 600   开始。也就是说没有在 300   500   之间的数据。因此最后一个范围分片(过渡分片)的表达式可变更为 VALUES < 500   而不需数据移动。因为在新过渡值后有区间分片,所以该新过渡值必须与区间分片边界对齐。在以上列子中,新过渡值 500   与区间分片边界对齐(不论此分片现在是否存在),作为修改的结果,区间分片系统目录中的 evalpos   值改变,且会重命名区间分片以符合 sys_p evalpos   名称的格式。

已修改的表具有以下分片:

  p0     VALUES < 100  -- range fragment

  p1     VALUES < 200  -- range fragment

  p2     VALUES < 500  -- last range fragment (= transition fragment

        -- with its expression modified)

  sys_p4 VALUES >= 600 AND VALUES < 700 - interval fragment (renamed

        -- to sys_p4 as evalpos changes from 6 to 4

        -- after the transition fragment change)

以下修改失败并产生了错误,因为有超出新过渡值的区间分片,新过渡值不与区间分片的临界值相等:

ALTER FRAGMENT ON TABLE tab MODIFY INTERVAL TRANSITION TO 550;

区间分片的可能值为 300   400   400   500   500   600   600   700   等等。新的过渡值 550   不在区间分片界限上,因此产生了错误。

如果在新和旧过渡值之间有区间分片,那么新过渡值必须对齐区间分片边界(该区间分片不须存在),除非新过渡值超出了最后一个区间分片的范围。在新和旧过渡值之间的所有区间分片都会转换为范围分片,并且它们的表达式会修改为符合范围分片表达式的格式。最后一个区间分片的表达式将转化为一个 VALUES < new   的范围分片( new   是新过渡值)。

此处是在新的区间分片中另一 INSERT 操作产生的示例:

CREATE TABLE tab (i INT, c CHAR(2))

          FRAGMENT BY RANGE (i)

          INTERVAL (100) STORE IN (dbs1, dbs2, dbs3)

          PARTITION p0 VALUES < 100 IN dbs0,

          PARTITION p1 VALUES < 200 IN dbs1,

          PARTITION p2 VALUES < 300 IN dbs0; -- last range fragment

          -- or transition fragment

          

          INSERT INTO tab

          VALUES (301, "AA"); -- creates interval fragment sys_p3 with

          -- fragment expression >= 300 AND < 400

          INSERT INTO tab

          VALUES (601, "BB"); -- creates interval fragment sys_p6

          -- with fragment expression >= 600 AND < 700

该表的分片表包含这些分片:

  p0        VALUES < 100     -- range fragment

  p1        VALUES < 200     -- range fragment

  p2        VALUES < 300     -- range fragment

   sys_p3    VALUES >= 300 AND VALUES < 400 -- interval fragment

   sys_p6    VALUES >= 600 AND VALUES < 700 -- interval fragment

随后的 ALTER FRAGMENT 示例都基于以上语句。

以下语句将过渡值从 300   增加到 500

   ALTER FRAGMENT ON TABLE tab MODIFY INTERVAL TRANSITION TO 500;

因为在就的和新的过渡值之间有一个区分片( sys_p3 ),此分片被转换为一个范围分片(表达式变为 < 400 )。因为还有一个超出新过渡值的区间分片( sys_p6 ),所以新过渡值必须对齐区间分片边界,是 INTERVAL(100)   规范的整数倍。即,此处区间分片可能为 300   400   400   500   500   600   600   700   等等。新过渡值 500   在区间分片的临界(该区间分片不必存在)。我们也不用在变更过渡值或创建任一分片的过程中移动数据。这可以通过以下操作完成:将分片 sys_p3   转换为新过渡值分片,更新它的表达式为 < 500   (因为它现在是范围分片)并重命名。

生成的表的分片表包含这些分片:

  p0          VALUES < 100  -- range fragment

  p1          VALUES < 200  -- range fragment

  p2          VALUES < 300  -- range fragment (was the old transition fragment)

 sys_p3rg    VALUES < 500  -- range fragment (was previously interval

          -- fragment sys_p3. Its expression was modified to a

          -- range expression. Its name was changed to a

          -- system-generated name in format sys_p<evalpos>rq )

          -- becomes the new transition fragment

 sys_p5      VALUES >= 600 AND VALUES < 700

          -- interval fragment (renamed to sys_5 brcause the

          -- evalpos value changes from 6 to 5 after the

          -- transition fragment change.)

以下尝试修改过渡值失败,并返回错误:

ALTER FRAGMENT ON TABLE tab

          MODIFY INTERVAL TRANSITION TO 550;

以上语句失败的原因为:有一个超出新过渡值的区间分片。并且该新过渡值不须对齐区间分片边界。

下一示例将过渡值从 500   增加到 700

ALTER FRAGMENT ON TABLE tab

          MODIFY INTERVAL TRANSITION TO 700;

生成的表的分片表包含以下分片:

p0         VALUES < 100 -- range fragment

p1         VALUES < 200 -- range fragment

p2         VALUES < 300 -- range fragment (was the old transition fragment)

sys_p3rg   VALUES < 400 -- range fragment (was previously interval fragment

          -- sys_p3, and its expression changed to a range expression.

          -- The fragment has been renamed to system-generated name

          -- in the format sys_p<evalpos>rg ).

sys_p6rg   VALUES < 700 -- range fragment (was previously the interval

          -- fragment sys_p6. Its expression was modified to a

          -- range expression and its name replaced by a system-

          -- generated name in the format sys_p<evalpos>rg )

          -- becomes the new transition fragment.

下一示例将过渡值从 700   增加到 750

ALTER FRAGMENT ON TABLE tab MODIFY INTERVAL TRANSITION TO 750;

因为没有超出新过渡值的区间分片存在,所以它不须对齐区间分片边界。

生成的表的分片表包含以下分片:

p0         VALUES < 100  -- range fragment

p1         VALUES < 200  -- range fragment

p2         VALUES < 300  -- range fragment (was the old transition fragment)

sys_p3rg   VALUES < 400  -- range fragment (was previously interval  

          -- fragment sys_p3. expression modified to a

          -- range expression. Fragment was renamed to a system

          -- generated name in the format sys_p<evalpos>rg)

sys_p6rg   VALUES < 750  -- range fragment (was previously the interval

          -- fragment sys_p6. Its expression was modified to a

          -- range expression, and the fragment was renamed to a

          -- system-generated name in format sys_p<evalpos>rg)

          -- becomes the new transition fragment

如果您希望在 MODIFY INTERVAL TRANSITION 操作过程中避免现有分片自动重命名,那么您可以首先使用 ALTER FRAGMENT MODIFY 语句用用户定义的名称重命名可能被 LTER FRAGMENT MODIFY INTERVAL TRANSITION 语句更改的系统生成的名称的区间分片。数据库服务器仅会重命名系统生成的区间分片名称(当创建新区间分片时避免产生不唯一的分片名称)。

 

 

官网:

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/70002567/viewspace-2788267/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-06-23

  • 博文量
    15
  • 访问量
    5989