一、创建分区表@H_404_1@ 分区表分为四类:1、范围分区表 2、列表分区表 3、哈希分区表 4、组合分区表
下面分别创建四类分区表。 @H_404_1@ 1、范围分区表
CREATE TABLE range_example(@H_404_1@ range_key_column DATE,@H_404_1@ DATA VARCHAR2(20),@H_404_1@ ID integer@H_404_1@ ) PARTITION BY RANGE(range_key_column)@H_404_1@ (@H_404_1@ PARTITION part01 VALUES LESS THAN (TO_DATE('2008-07-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs01,@H_404_1@ PARTITION part02 VALUES LESS THAN (TO_DATE('2008-08-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs02,@H_404_1@ PARTITION part03 VALUES LESS THAN (TO_DATE('2008-09-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs03@H_404_1@ ); |
2、列表分区表 @H_404_1@
CREATE TABLE list_example(@H_404_1@ dname VARCHAR2(10),@H_404_1@ DATA VARCHAR2(20)@H_404_1@ )PARTITION BY LIST(dname)@H_404_1@ (@H_404_1@ PARTITION part01 VALUES('ME','PE','QC','RD'),@H_404_1@ PARTITION part02 VALUES('SMT','SALE')@H_404_1@ ); |
3、哈希分区表 @H_404_1@
CREATE TABLE hash_example(@H_404_1@ hash_key_column DATE,@H_404_1@ DATA VARCHAR2(20)@H_404_1@ ) PARTITION BY HASH(hash_key_cloumn)@H_404_1@ (@H_404_1@ PARTITION part01,@H_404_1@ PARTITION part02@H_404_1@ ); |
4、组合分区表 @H_404_1@
CREATE TABLE range_hash_example(@H_404_1@ range_column_key DATE,@H_404_1@ hash_column_key INT,@H_404_1@ DATA VARCHAR2(20)@H_404_1@ )@H_404_1@ PARTITION BY RANGE(range_column_key)@H_404_1@ SUBPARTITION BY HASH(hash_column_key) SUBPARTITIONS 2@H_404_1@ (@H_404_1@ PARTITION part_1 VALUES LESS THAN (TO_DATE('2008-08-01','yyyy-mm-dd'))(@H_404_1@ SUBPARTITION part_1_sub_1,@H_404_1@ SUBPARTITION part_1_sub_2,@H_404_1@ SUBPARTITION part_1_sub_3@H_404_1@ ),@H_404_1@ PARTITION part_2 VALUES LESS THAN (TO_DATE('2008-09-01','yyyy-mm-dd'))(@H_404_1@ SUBPARTITION part_2_sub_1,@H_404_1@ SUBPARTITION part_2_sub_2@H_404_1@ )@H_404_1@ ); |
@H_404_1@ --注 subpartitions 2 并不是指定subpartition的个数一定为2,实际上每个分区的子分区个数可以不同。subpartitions 关键字的作用到底是什么?如果不指定subpartition的具体明细,则系统按照subpartitions的值指定subpartition的个数生成子分区,名称由系统定义 。
-- range partitioned table@H_404_1@ ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-dd hh24:mi:ss'));@H_404_1@ @H_404_1@ --list partitioned table@H_404_1@ ALTER TABLE list_example ADD PARTITION part04 VALUES ('TE');@H_404_1@ @H_404_1@ --Adding Values for a List Partition@H_404_1@ ALTER TABLE list_example MODIFY PARTITION part04 ADD VALUES('MIS');@H_404_1@ @H_404_1@ --Dropping Values from a List Partition@H_404_1@ ALTER TABLE list_example MODIFY PARTITION part04 DROP VALUES('MIS');@H_404_1@ @H_404_1@ --hash partitioned table @H_404_1@ ALTER TABLE hash_example ADD PARTITION part03;@H_404_1@ @H_404_1@ --增加subpartition@H_404_1@ ALTER TABLE range_hash_example MODIFY PARTITION @H_404_1@ part_1 ADD SUBPARTITION part_1_sub_4; |
注:hash partitioned table 新增partition时,现有表的中所有data都有重新计算hash值,然后重新分配到分区中。所以被重新分配的分区的 indexes需要rebuild 。@H_404_1@ @H_404_1@ 三、删除分区@H_404_1@ You can drop partitions from range,list,or composite range-list partitioned tables.
ALTER TABLE ... DROP PARTITION part_name; |
For hash-partitioned tables,or hash subpartitions of range-hash partitioned tables,you must perform. a coalesce operation instead.@H_404_1@
-- 减少hash 分区的个数,一次减少一个。不能指定减少partition的名称。@H_404_1@ ALTER TABLE hash_example COALESCE PARTITION ;@H_404_1@ --subpartition 的语法对于如下@H_404_1@ ALTER TABLE diving MODIFY PARTITION us_locations@H_404_1@ COALESCE SUBPARTITION; |
四、 分区合并 @H_404_1@ 1. 合并父分区@H_404_1@
ALTER TABLE range_example @H_404_1@ MERGE PARTITIONS part01_1,part01_2 INTO PARTITION part01 @H_404_1@ UPDATE INDEXES; |
@H_404_1@ 如果省略update indexes子句的话,必须重建受影响的分区的index 。 ALTER TABLE range_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES; @H_404_1@ @H_404_1@ 2. 合并子分区 @H_404_1@
ALTER TABLE composite_example @H_404_1@ MERGE SUBPARTITIONS part_1_sub_2,part_1_sub_3 INTO SUBPARTITION part_1_sub_2 @H_404_1@ UPDATE INDEXES; |
五、分割分区 hash partitions or subpartitions不能分割。如果指定的分割分区包含任何的数据时,对应的indexes可以被标识为UNUSABLE 。如果是一般的Heap Table,新的分区indexes为UNUSABLE,所有gloabl indexes被标识为UNUSABLE 。如果是Index-organized table 新分区的indexes 为UNUSABLE,global indexes 仍然为USABLE。 @H_404_1@ 1、range类型分区的分割@H_404_1@
ALTER TABLE range_example @H_404_1@ SPLIT PARTITION part01@H_404_1@ AT (TO_DATE('2008-06-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))@H_404_1@ INTO ( PARTITION part01_1,PARTITION part01_2@H_404_1@ ); |
@H_404_1@ 一个分区一次性只能分割成两个分区,at关键字后面指定的值为第一个分区的range范围,默认为less than 。
2、list类型分区的分割@H_404_1@
ALTER TABLE list_example @H_404_1@ SPLIT PARTITION part01 VALUES('ME','PE') @H_404_1@ INTO ( PARTITION part01_1,PARTITION part01_2 @H_404_1@ ); |
3、Range_Hash类型分区的分割 新分区会对原有分区的subpartition做rehash的动作。如果在分割是指定subpartition的个数,则按新规则rehash subpartition,如果没有指定则保留原有subpartition的个数不变。
ALTER TABLE range_hash_example SPLIT PARTITION part_1@H_404_1@ AT (TO_DATE('2008-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) INTO (@H_404_1@ PARTITION part_1_1 SUBPARTITIONS 2 STORE IN (tbs01,tbs02),@H_404_1@ PARTITION part_1_2 @H_404_1@ ); |
subpartitions 2 -- 指定新分区的subpartition的个数,store in 子句指定subpartition存储的tablespace 。
六、Exchanging Partitions
可以将分区表转换成非分区表,或者几种不同分区表之间的转换。@H_404_1@ 如下:@H_404_1@
CREATE TABLE hash_part02 AS SELECT * FROM hash_example WHERE 1=2;@H_404_1@ ALTER TABLE hash_example EXCHANGE PARTITION part02 WITH TABLE hash_part02; |
这时,分区表hash_example中的part02分区的资料将被转移到hash_part02这个非分区表中。
七、索引@H_404_1@ 在分区表上可以建立三种类型的索引:1、和普通表一样的全局索引。2、全局分区索引。3、本地分区索引。@H_404_1@ 它们之间的区别如下图示。
以表range_example为例。@H_404_1@ 1.建立普通的索引@H_404_1@ create index com_index_range_example_id on range_example(id);
2.建立本地分区索引@H_404_1@ create index local_index_range_example_id on range_example(id) local;
3.建立全局分区索引@H_404_1@ create index gidx_range_exampel_id on range_example(id) @H_404_1@ GLOBAL partition by range(id)@H_404_1@ (@H_404_1@ part_01 values less than(1000),@H_404_1@ part_02 values less than(MAXVALUE)@H_404_1@ );@H_404_1@ @H_404_1@ 对于分区索引的删除,local index 不能指定分区名称,单独的删除分区索引。local index 对应的分区会伴随着data分区的删除而一起被删除。@H_404_1@ global partition index 可以指定分区名称,删除某一分区。但是有一点要注意,如果该分区不为空,则会导致更高一级的索引分区被置为UNUSABLE 。@H_404_1@ ALTER INDEX gidx_range_exampel_id drop partition part_01 ; 此句将导致part_02 状态为UNUSABLE 。
原文链接:/oracle/207289.html