MODIFY 子句
使用 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 语句会导致重命名现有的分片:
l 如果在新的和旧的过渡值之间没有区间分片,但是区间分片早已超出新的过渡值,系统生成的区间分片名称的最终的数字将按区间分片边界值除以新过渡值和旧过渡值之间的差额的值减少。
例如,如果区间值表达式定义了一个等于 20 的区间大小,且旧过渡值和新过渡值之间相差 60,那么名为 sys_p7 的区间分片将会被重命名为 sys_p4,因为它的商为 (60/20) = 3 。
l 如果在新的和旧的过渡值之间存在区间分片,那么字符 rg 会附加在它们的名称上以标识它们成为了范围分片,因为它们分片表达式的上限不再大于该表的过渡值。
例如 ,如果一个表插入的过渡值符合其区间分片 sys_p5 VALUES 值的上限,那么此分片将更改为范围分片,并重命名为 sys_p5rg (它也是过渡分片)。如果另一个称为 sys_p4 的区间分片也有一个小于 VALUES 上限值在它的分片表达式中,那么此分片也会变为范围分片,并重命名为 sys_p4rg。
在分片重命名操作过程中,当更新 sysfragments 系统目录表时,会在此分片上放置一个互斥锁。
l partition 列中带有新分片标识符值,
l 对于任何区间分片或滚动分片(在当前 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_pevalpos 名称的格式。
已修改的表具有以下分片:
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_prq )
-- 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_prg ).
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_prg )
-- 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_prg)
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_prg)
-- becomes the new transition fragment
如果您希望在 MODIFY INTERVAL TRANSITION 操作过程中避免现有分片自动重命名,那么您可以首先使用 ALTER FRAGMENT MODIFY 语句用用户定义的名称重命名可能被 LTER FRAGMENT MODIFY INTERVAL TRANSITION 语句更改的系统生成的名称的区间分片。数据库服务器仅会重命名系统生成的区间分片名称(当创建新区间分片时避免产生不唯一的分片名称)。