增加一级分区¶
增加水平分区:可以为范围分区表、列表分区表和哈希分区表添加一级子分区表。
使用增加分区操作时,应注意以下规则:
- 范围分区表只可添加在最后位置,且原有子分区表不可包括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;