增加一级分区

增加水平分区:可以为范围分区表、列表分区表和哈希分区表添加一级子分区表。

使用增加分区操作时,应注意以下规则:

  • 范围分区表只可添加在最后位置,且原有子分区表不可包括MAXVALUE子分区表。
  • 不能向间隔分区表,添加子分区表。
  • 若添加列表分区表,则原子分区表不允许包括DEFAULT子分区表。
  • 若添加哈希分区表,哈希桶数目变化,需要对数据重新哈希,因此,添加子分区表会引起数据的移动。可以参考动态哈希的概念,因为动态哈希可以在改变哈希桶数时,将数据的移动只限制在一个哈希桶中,以此来最大限度的减少数据的移动。
  • 如果表上建有局部分区索引,那么系统会为新增加的子分区表自动创建局部分区索引,且由系统给索引命名。
  • 如果为哈希分区表增加子分区表,则哈希分区表创建时,使用的是hash_partitions_by_quantity子句,且指定了表空间,那么新创建的表的表空间要与当前子分区表个数以表空间个数取余,获取的子分区表表空间保持一致。
  • 如果是范围或列表分区表,则增加分区后,全局分区索引,局部分区索引,全局非分区索引依然有效,可以使用;如果是哈希分区表,则全局索引与分区索引都将失效,数据移动的分区及新生成的分区相关联的局部子分区索引都失效;如果指定更新局部分区索引,数据移动的分区及新生成的分区相关联的局部子分区索引有效。
  • 局部分区索引会在添加表分区时自动添加对应的索引分区。全局分区索引当前只支持范围和哈希分区,因为范围全局分区索引要求必须有一个MAXVALUE分区,所以,全局分区索引只支持添加哈希分区索引。

注:添加范围或列表子分区表操作不会引起全局索引、全局分区索引的额外操作。添加哈希分区表会引起数据的移动,若未指定同步更新索引,在添加哈希子分区表操作后会置全局索引、分区索引为UNUSABLE状态。

添加分区举例

示例1:添加子分区表到范围分区表

存在表tab含有当前月之前的十二个月的数据。在October 1, 2006为October添加分区,存储在表空间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
( 
    id NUMERIC(6) ,
    time_id DATE
)
PARTITION BY RANGE (time_id)
( 
    PARTITION p1 VALUES LESS THAN ('2006-APR-01') TABLESPACE ts1,
    PARTITION p2 VALUES LESS THAN ('2006-JUL-01') TABLESPACE ts2
);

ALTER TABLE tab ADD PARTITION p3 VALUES LESS THAN ( '2006-OCT-01' ) TABLESPACE ts1;

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

范围分区的局部和全局索引仍然有效。

示例2:添加子分区表到哈希分区表

下面语句是添加子分区表到哈希分区表tab的两种方式

--  清理环境
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
(
    id NUMERIC,
    name VARCHAR(60)
)

PARTITION BY HASH (id) PARTITIONS 2 TABLESPACE ts1;

--添加一个新的一级哈希子分区表存储在默认的表空间
ALTER TABLE tab ADD PARTITION;

--添加一级子分区表,名为p_named,存储在表空间ts2
ALTER TABLE tab
ADD PARTITION p_named TABLESPACE ts2;

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

示例3:添加子分区表到列表分区表

--  清理环境
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
(
    id NUMERIC,
    status VARCHAR(2)
)
TABLESPACE ts1
PARTITION BY LIST (status)
( 
    PARTITION p1 VALUES('A1', 'A2'),
    PARTITION p2 VALUES('B1', 'B2', 'B3')
);

ALTER TABLE tab ADD PARTITION p3 VALUES ('C1', 'C2', 'C3') TABLESPACE ts2 NOLOGGING;

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

示例4:添加子分区表到范围-列表复合分区表

--  清理环境
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
( 
    id NUMERIC(6),
    time_id DATE,
    status VARCHAR(2)
)
PARTITION BY RANGE (time_id)
SUBPARTITION BY LIST (status)
(
    PARTITION p1 VALUES LESS THAN ('2006-APR-01')
    ( 
        SUBPARTITION p1_a VALUES ('A1', 'A2'),
        SUBPARTITION p1_b VALUES ('B1', 'B2', 'B3')
    ),
    PARTITION p2 VALUES LESS THAN ('2006-JUL-01')
    ( 
        SUBPARTITION p2_a VALUES ('A1', 'A2'),
        SUBPARTITION p2_b VALUES ('B1', 'B2', 'B3')
    )
);


ALTER TABLE tab ADD PARTITION p3 VALUES LESS THAN('2006-OCT-01');

ALTER TABLE tab ADD PARTITION p4 VALUES LESS THAN('2007-JAN-01') (subpartition p4_a VALUES ('A1','A2'));

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