您可以使用该选项添加有范围区间分片结构的表的最后一个范围分片的过渡值。此过渡值不会被使用 ALTER FRAGMENT 语句的 MODIFY INTERVAL TRANSITION 选项减少。
您不能使用 MODIFY 选项的 PARTITION partition VALUES 语法修改一个使用范围区间存储分布方案的表的最后一个范围分片(也称为 transition fragment)的范围表达式。然而过渡值(此范围表达式的上限)会在使用 MODIFY INTERVAL TRANSITION TO 关键字指定新的上限时增加。当过渡值更改后不会有数据移动。
要减少过渡值(通过重置过渡分片范围的上限),您必须执行 ALTER FRAGMENT INIT 操作以重新定义该表的范围区间分布存储方案。
如果在新的和旧的过渡值之间没有区间分片,但是区间分片早已超出新的过渡值,系统生成的区间分片名称的最终的数字将按区间分片边界值除以新过渡值和旧过渡值之间的差额的值减少。
例如,如果区间值表达式定义了一个等于 20 的区间大小,且旧过渡值和新过渡值之间相差 60,那么名为 sys_p7 的区间分片将会被重命名为 sys_p4,因为它的商为 (60/20) = 3 。
如果在新的和旧的过渡值之间存在区间分片,那么字符 rg 会附加在它们的名称上以标识它们成为了范围分片,因为它们分片表达式的上限不再大于该表的过渡值。
例如 ,如果一个表插入的过渡值符合其区间分片 sys_p5 VALUES 值的上限,那么此分片将更改为范围分片,并重命名为 sys_p5rg (它也是过渡分片)。如果另一个称为 sys_p4 的区间分片也有一个小于 VALUES 上限值在它的分片表达式中,那么此分片也会变为范围分片,并重命名为 sys_p4rg。
在以上列出的情况中,一些分片被重命名以确保分片列表中的每个分片是唯一的,并保持为区间分片系统生成的名称和在系统目录中这些分片对应的 sysfragments.evalpos 值之间的相关性。(另见 自动重命名区间分片标识符。)
以下的一些 ALTER FRAGMENT 示例会阐述该分片重命名行为。
以下语句定义了一个使用范围区间春初分布方案的已分片的表 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 ON TABLE tabtrans MODIFY INTERVAL TRANSITION TO 250;此语句失败,因为它试图减少该过渡值。如果目标是保持当前的区间值 100 ,但是对于新过渡值则变为 250 ,那么需要 ALTER FRAGMENT INIT 操作重新定义该范围分片。为了保持范围分片的边界对齐,该范紧接的过渡分片的范围分片的新上限值必须为 150。在新的分布存储方案中,如果要插入分片键值大于 250 的行,那么数据库服务器会生成一个新的范围为 100 的区间分片,之前的整数值 50 (模 100)作为上限.
INSERT INTO tabtrans 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 - 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) 规范定义了该表的分片方案。
ALTER FRAGMENT ON TABLE tabtrans MODIFY INTERVAL TRANSITION TO 500;
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 是新过渡值)。
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 示例都基于以上语句。
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;
以上语句失败的原因为:有一个超出新过渡值的区间分片。并且该新过渡值不须对齐区间分片边界。
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.
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 语句更改的系统生成的名称的区间分片。数据库服务器仅会重命名系统生成的区间分片名称(当创建新区间分片时避免产生不唯一的分片名称)。