分裂一级分区

使用ALTER TABLE … SPLIT PARTITION语句分裂分区。

AT clause只适用于范围分区,literal的值将作为第一个子分区表的开区间上限,作为第二个子分区表的闭区间下限。

VALUES只适用于列表分区,literal中指定属于第一个子分区表的值,然后创建第一个子分区表,剩余的值创建成为第二个子分区表。Literal的值必须是被分裂子分区表literal值的子集。

INTO如果更新的是复合分区,对于范围-哈希复合分区,可以为二级子分区表重新指定表空间,对于范围-列表和列表-列表复合分区则不可以更改二级子分区表的任何属性,它们的属性都将继承于当前的二级子分区表。如果不为新生成的二级子分区表指定分区名,系统会为它们自动生成表名。

使用分裂分区时,应注意以下规则:

  • 分裂出的新分区表,如果不指定分区表属性,那么将会继承原有分区表的属性。
  • 如果表含有lob列,那么可以通过lob_storage_clause指定被分裂的子分区表的lob属性。系统会删除lob列和lob索引的段,为分裂后的lob与lob索引创建新的段。
  • 可以对范围分区表的maxvalue子分区表和列表分区表的default子分区表进行分裂,分裂后第一个子分区表,是以分裂参数产生的子分区表,第二个子分区表,是maxvalue或default子分区表。
  • 系统会对局部分区索引进行分裂,即使局部分区索引已经被标记为unusable,它也会被分裂。分裂后的局部分区索引会继承原来的索引属性。分裂出的index,会存储在原来索引的表空间中,如果原来的索引未设置表空间,则存储在表的表空间中。
  • 不能对哈希分区表进行分裂操作。
  • 分裂后,局部分区索引,全局分区索引与全局非分区索引将会失效。
  • 如果分裂的是复合分区表的一级子分区表,那么分裂后一级子分区表的二级子分区表个数等于未分裂时一级子分区表的二级子分区表个数。
  • 分裂复合分区的一级分区(P1)时,如果二级分区名称是“一级分区名_子分区名”,如“P1_SP1”,则对应新生成的二级分区名继承分裂后的一级分区名,如“P1A_SP1”,“P1B_SP1”。对于其他形式的二级分区名称,新生成的二级分区名以“SYS_SP”为开头命名。

注:不支持分裂一级子分区表的同时为分裂的一级子分区表指定二级子分区表。

示例1:分裂范围分区表一级子分区表

下面的例子分裂范围分区表,将分区表tab中的一级子分区表p1分裂成两个一级子分区表p1_1和p1_2。将一级子分区表p2分裂成两个一级子分区表p2_1和p2_2,且指定p2_1存储在表空间ts1

--  清理环境
DROP TABLE tab;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

--  创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;

-- 创建分区表
CREATE TABLE tab 
(
    c1 int, 
    c2 int
)
PARTITION BY RANGE(c1)
(
    PARTITION p1 VALUES LESS THAN(10) TABLESPACE ts1,
    PARTITION p2 VALUES LESS THAN(20) TABLESPACE ts2,
    PARTITION p3 VALUES LESS THAN(30)
);

ALTER TABLE tab SPLIT PARTITION p1 at (5) INTO ( PARTITION p1_1, PARTITION p1_2);

ALTER TABLE tab SPLIT PARTITION p2 at (15) INTO ( PARTITION p2_1 TABLESPACE ts1, PARTITION p2_2);

ALTER TABLE tab DROP PARTITION p3;

--  删除表和表空间
DROP TABLE tab CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

示例2:分裂列表分区表一级子分区表

下面的例子将p2子分区表分成两个

--  清理环境
DROP TABLE tab;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

--  创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;

-- 创建分区表
CREATE TABLE tab 
(
    c1 int, 
    c2 varchar(2)
)
PARTITION BY LIST(c2)
(
    PARTITION p1 VALUES ('A1', 'A2') TABLESPACE ts1,
    PARTITION p2 VALUES ('B1', 'B2', 'B3', 'C1', 'C2', 'C3') TABLESPACE ts2
);

ALTER TABLE tab SPLIT PARTITION p2 VALUES ('B1', 'B2', 'B3') INTO ( 
PARTITION p2_1 TABLESPACE ts1, PARTITION p2_2 STORAGE (NEXT 2M PCTINCREASE 25));

--  删除表和表空间
DROP TABLE tab CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

原始的p2分区值如下

PARTITION p2 VALUES('B1', 'B2', 'B3', 'C1', 'C2', 'C3')

分成的两个新子分区表分别为:

p2_1子分区表有列值为('B1', 'B2', 'B3')

p2_2子分区表继承剩下的列值为('C1', 'C2', 'C3')

示例3:分裂间隔分区表一级子分区表

下面的例子将MAY 2007子分区表分裂成两个

--  清理环境
DROP TABLE tab;

-- 创建分区表
CREATE TABLE tab 
(
    id NUMERIC, 
    time_id DATE
)
PARTITION BY RANGE (time_id)
INTERVAL(INTERVAL '1' MONTH)
(
    PARTITION p1 VALUES LESS THAN ('2007-05-01'),
    PARTITION p2 VALUES LESS THAN ('2007-06-01')
);

ALTER TABLE tab SPLIT PARTITION FOR('2007-MAY-01') AT ('2007-MAY-15');

--  删除表
DROP TABLE tab CASCADE;

示例4:分裂范围-哈希复合分区表一级子分区表

下面的例子分裂范围-哈希复合分区表tab的一级子分区表p2成两个一级子分区表p2_1和p2_2

--  清理环境
DROP TABLE tab;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

--  创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;

-- 创建分区表
CREATE TABLE tab 
(
    c1 int, 
    c2 int
)
PARTITION BY RANGE (c1)
SUBPARTITION BY HASH (c2)
SUBPARTITIONS 4 STORE IN(ts2)
( 
    PARTITION p1 VALUES LESS THAN (10) TABLESPACE ts1,
    PARTITION p2 VALUES LESS THAN (20) TABLESPACE ts2
);

ALTER TABLE tab SPLIT PARTITION p2 AT (15) INTO ( PARTITION p2_1 TABLESPACE TS1, PARTITION p2_2);

--  删除表和表空间
DROP TABLE tab CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

示例5:分裂范围-列表复合分区表一级子分区表

以下例子分裂范围列表复合分区一级子分区表,分裂成两个一级子分区表

--  清理环境
DROP TABLE tab;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

--  创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;

-- 创建分区表
CREATE TABLE tab 
(
    c1 DATE, 
    c2 VARCHAR(2)
)
TABLESPACE ts1 PARTITION BY RANGE (c1)
SUBPARTITION BY LIST (c2)
(
    PARTITION p1 VALUES LESS THAN ('2011-03-01')
    (
    SUBPARTITION p1_sub1 VALUES ('A1', 'A2'),
    SUBPARTITION p1_sub2 VALUES ('B1', 'B2', 'B3')
    ),
    PARTITION p2 VALUES LESS THAN ('2011-05-01')
    (
    SUBPARTITION p2_sub1 VALUES ('C1', 'C2'),
    SUBPARTITION p2_sub2 VALUES ('D1', 'D2', 'D3')
    )
);

ALTER TABLE tab SPLIT PARTITION p1 AT('2011-02-01') INTO (
PARTITION p1_1 TABLESPACE ts1, PARTITION p1_2 STORAGE (NEXT 2M PCTINCREASE 25) TABLESPACE ts2) ;


--  删除表和表空间
DROP TABLE tab CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;