oracle在表上创建分区,Oracle分区表 (Partition Table) 的创建及管理

一、创建

分区表分为四类:1、范围分区表 2、列表分区表 3、哈希分区表 4、组合分区表

下面分别创建四类分区表。

1、范围分区表CREATE TABLE range_example(

range_key_column DATE,

DATA VARCHAR2(20),

ID integer

) PARTITION BY RANGE(range_key_column)

(

PARTITION part01 VALUES LESS THAN (TO_DATE('2008-07-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs01,

PARTITION part02 VALUES LESS THAN (TO_DATE('2008-08-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs02,

PARTITION part03 VALUES LESS THAN (TO_DATE('2008-09-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs03

);

2、列表分区表CREATE TABLE list_example(

dname VARCHAR2(10),

DATA VARCHAR2(20)

)PARTITION BY LIST(dname)

(

PARTITION part01 VALUES('ME','PE','QC','RD'),

PARTITION part02 VALUES('SMT','SALE')

);

3、哈希分区表CREATE TABLE hash_example(

hash_key_column DATE,

DATA VARCHAR2(20)

) PARTITION BY HASH(hash_key_cloumn)

(

PARTITION part01 ,

PARTITION part02

);

4、组合分区表CREATE TABLE range_hash_example(

range_column_key DATE,

hash_column_key INT,

DATA VARCHAR2(20)

)

PARTITION BY RANGE(range_column_key)

SUBPARTITION BY HASH(hash_column_key) SUBPARTITIONS 2

(

PARTITION part_1 VALUES LESS THAN (TO_DATE('2008-08-01','yyyy-mm-dd'))(

SUBPARTITION part_1_sub_1,

SUBPARTITION part_1_sub_2,

SUBPARTITION part_1_sub_3

),

PARTITION part_2 VALUES LESS THAN (TO_DATE('2008-09-01','yyyy-mm-dd'))(

SUBPARTITION part_2_sub_1,

SUBPARTITION part_2_sub_2

)

);

--注 subpartitions 2 并不是指定subpartition的个数一定为2,实际上每个分区的子分区个数可以不同。subpartitions 关键字的作用到底是什么?如果不指定subpartition的具体明细,则系统按照subpartitions的值指定subpartition的个数生成子分区,名称由系统定义 。

二、增加分区-- range partitioned table

ALTER TABLE range_example ADD PARTITION part04 VALUES LESS THAN (TO_DATE('2008-10-1 00:00:00','yyyy-mm-dd hh24:mi:ss'));

--list partitioned table

ALTER TABLE list_example ADD PARTITION part04 VALUES ('TE');

--Adding Values for a List Partition

ALTER TABLE  list_example MODIFY PARTITION part04 ADD VALUES('MIS');

--Dropping Values from a List Partition

ALTER TABLE  list_example MODIFY PARTITION part04 DROP VALUES('MIS');

--hash partitioned table

ALTER TABLE hash_example ADD PARTITION part03;

--增加subpartition

ALTER TABLE range_hash_exampleMODIFYPARTITION

part_1 ADD SUBPARTITION part_1_sub_4;

注:hash partitioned table 新增partition时,现有表的中所有data都有重新计算hash值,然后重新分配到分区中。所以被重新分配的分区的 indexes需要rebuild 。

三、删除分区

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.-- 减少hash 分区的个数,一次减少一个。不能指定减少partition的名称。

ALTER TABLE hash_example COALESCE PARTITION ;

--subpartition 的语法对于如下

ALTER TABLE divingMODIFYPARTITION us_locations

COALESCE SUBPARTITION;

四、 分区合并

1. 合并父分区ALTER TABLE range_example

MERGE PARTITIONS part01_1,part01_2 INTO PARTITION part01

UPDATE INDEXES;

如果省略update indexes子句的话,必须重建受影响的分区的index 。 ALTER TABLE range_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES;

2. 合并子分区

ALTER TABLE composite_example

MERGE SUBPARTITIONS part_1_sub_2,part_1_sub_3 INTO SUBPARTITION part_1_sub_2

UPDATE INDEXES;

五、分割分区 hash partitions or subpartitions不能分割。如果指定的分割分区包含任何的数据时,对应的indexes可以被标识为UNUSABLE 。如果是一般的Heap Table,新的分区indexes为UNUSABLE ,所有gloabl indexes被标识为UNUSABLE 。如果是Index-organized table 新分区的indexes 为UNUSABLE,global indexes 仍然为USABLE。

1、range类型分区的分割ALTER  TABLE range_example

SPLIT PARTITION part01

AT (TO_DATE('2008-06-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))

INTO ( PARTITION part01_1,PARTITION part01_2

);

一个分区一次性只能分割成两个分区,at关键字后面指定的值为第一个分区的range范围,默认为less than 。

2、list类型分区的分割ALTER  TABLE list_example

SPLIT PARTITION part01 VALUES('ME','PE')

INTO ( PARTITION part01_1, PARTITION part01_2

);

3、Range_Hash类型分区的分割 新分区会对原有分区的subpartition做rehash的动作。如果在分割是指定subpartition的个数,则按新规则rehash subpartition,如果没有指定则保留原有subpartition的个数不变。ALTER  TABLE range_hash_example SPLIT PARTITION part_1

AT (TO_DATE('2008-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) INTO (

PARTITION part_1_1 SUBPARTITIONS 2 STORE IN (tbs01,tbs02),

PARTITION part_1_2

);

subpartitions 2 -- 指定新分区的subpartition的个数,store in 子句指定subpartition存储的tablespace 。

六、Exchanging Partitions

可以将分区表转换成非分区表,或者几种不同分区表之间的转换。

如下:CREATE TABLE hash_part02 AS SELECT * FROM hash_example WHERE 1=2;

ALTER TABLE hash_example EXCHANGE PARTITION part02 WITH TABLE hash_part02;

这时,分区表hash_example中的part02分区的资料将被转移到hash_part02这个非分区表中。

七、索引

在分区表上可以建立三种类型的索引:1、和普通表一样的全局索引。2、全局。3、本地分区索引。

它们之间的区别如下图示。

8858072_200809251507411.jpg

8858072_200809251501281.jpg

8858072_200809251457051.jpg

以表range_example为例。

1.建立普通的索引

create index com_index_range_example_id on range_example(id);

2.建立本地分区索引

create index  local_index_range_example_id on range_example(id)local;

3.建立全局分区索引

create index gidx_range_exampel_id on range_example(id)

GLOBAL  partition by  range(id)(

part_01 values less than(1000),

part_02 values less than(MAXVALUE)

);

对于分区索引的删除,local index 不能指定分区名称,单独的删除分区索引。local index 对应的分区会伴随着data分区的删除而一起被删除。

global partition index 可以指定分区名称,删除某一分区。但是有一点要注意,如果该分区不为空,则会导致更高一级的索引分区被置为UNUSABLE 。

ALTER INDEX  gidx_range_exampel_id drop partition part_01  ; 此句将导致part_02 状态为UNUSABLE 。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值