博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Oracle分区表 (Partition Table) 的创建及管理
阅读量:5009 次
发布时间:2019-06-12

本文共 7303 字,大约阅读时间需要 24 分钟。

一、创建分区表

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

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

1、范围分区表

1 CREATE TABLE range_example( 2       range_key_column DATE, 3       DATA VARCHAR2(20), 4       ID integer 5 ) PARTITION BY RANGE(range_key_column) 6 ( 7   PARTITION part01 VALUES LESS THAN (TO_DATE('2008-07-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs01, 8   PARTITION part02 VALUES LESS THAN (TO_DATE('2008-08-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs02, 9   PARTITION part03 VALUES LESS THAN (TO_DATE('2008-09-1 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs0310 );

2、列表分区表

1 CREATE TABLE list_example(2       dname VARCHAR2(10),3       DATA VARCHAR2(20)4 ) PARTITION BY LIST(dname)5 (    6   PARTITION part01 VALUES('ME','PE','QC','RD'),7   PARTITION part02 VALUES('SMT','SALE')8 );

3、哈希分区表

1 CREATE TABLE hash_example(2       hash_key_column DATE,3       DATA VARCHAR2(20)4 ) PARTITION BY HASH(hash_key_cloumn)5 (    6   PARTITION part01 ,7   PARTITION part028 );

4、组合分区表

1 CREATE TABLE range_hash_example( 2       range_column_key DATE, 3       hash_column_key INT, 4       DATA VARCHAR2(20) 5 ) 6 PARTITION BY RANGE(range_column_key) 7 SUBPARTITION BY HASH(hash_column_key) SUBPARTITIONS 2 8 ( 9    PARTITION part_1 VALUES LESS THAN (TO_DATE('2008-08-01','yyyy-mm-dd'))(10 11         SUBPARTITION part_1_sub_1,12         SUBPARTITION part_1_sub_2,13         SUBPARTITION part_1_sub_314    ),15 16    PARTITION part_2 VALUES LESS THAN (TO_DATE('2008-09-01','yyyy-mm-dd'))(17         SUBPARTITION part_2_sub_1,18         SUBPARTITION part_2_sub_219    )20 );

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

二、增加分区

-- range partitioned tableALTER 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 tableALTER TABLE list_example ADD PARTITION part04 VALUES ('TE');-- Adding Values for a List PartitionALTER TABLE  list_example MODIFY PARTITION part04 ADD VALUES('MIS'); -- Dropping Values from a List PartitionALTER TABLE  list_example MODIFY PARTITION part04 DROP VALUES('MIS');-- hash partitioned tableALTER TABLE hash_example ADD PARTITION part03;-- 增加subpartitionALTER TABLE range_hash_example MODIFY PARTITION 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.

1 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.

1 -- 减少hash 分区的个数,一次减少一个。不能指定减少partition的名称。2 ALTER TABLE hash_example COALESCE PARTITION ;3 4 -- subpartition 的语法对于如下5 ALTER TABLE diving MODIFY PARTITION us_locations COALESCE SUBPARTITION;

四、 分区合并

1. 合并父分区 

1 ALTER TABLE range_example2 MERGE PARTITIONS part01_1,part01_2 INTO PARTITION part013 UPDATE INDEXES;

如果省略update indexes子句的话,必须重建受影响的分区的index 。

ALTER TABLE range_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES;

2. 合并子分区

1 ALTER TABLE composite_example2 MERGE SUBPARTITIONS part_1_sub_2,part_1_sub_3 INTO SUBPARTITION part_1_sub_23 UPDATE INDEXES;          

Merging Partitions 注意:

  • 使用ALTER TABLE .. MERGE PARTITION语句将两个分区的内容合并到另外一个分区,两个源分区和关联的local index都会被drop
  • 不能用于hash分区表或 hash subpartitions of a composite *-hash partitioned table
  • 不能用于合并引用分区表(reference-partitioned table)

合并范围分区

允许合并两个临近范围的分区到另外分区,不相邻分区无法合并。合并结果分区继承两个源分区的最大边界。

demo:

1 -- Create a Table with four partitions each on its own tablespace 2 -- Partitioned by range on the data column. 3 CREATE TABLE four_seasons 4 ( 5         one DATE, 6         two VARCHAR2(60), 7         three NUMBER 8 ) 9 PARTITION  BY RANGE ( one )10 (11 PARTITION quarter_one12   VALUES LESS THAN ( TO_DATE('01-apr-1998','dd-mon-yyyy'))13   TABLESPACE quarter_one,14 15 PARTITION quarter_two16   VALUES LESS THAN ( TO_DATE('01-jul-1998','dd-mon-yyyy'))17   TABLESPACE quarter_two,18 19 PARTITION quarter_three20   VALUES LESS THAN ( TO_DATE('01-oct-1998','dd-mon-yyyy'))21   TABLESPACE quarter_three,22 23 PARTITION quarter_four24   VALUES LESS THAN ( TO_DATE('01-jan-1999','dd-mon-yyyy'))25   TABLESPACE quarter_four26 );27 28 -- Create local PREFIXED index on Four_Seasons29 -- Prefixed because the leftmost columns of the index match the30 -- Partitioning key CREATE INDEX i_four_seasons_l ON four_seasons ( one,two )31 LOCAL (32 PARTITION i_quarter_one TABLESPACE i_quarter_one,33 PARTITION i_quarter_two TABLESPACE i_quarter_two,34 PARTITION i_quarter_three TABLESPACE i_quarter_three,35 PARTITION i_quarter_four TABLESPACE i_quarter_four36 );

下一步,合并分区.

1 -- Merge the first two partitions2 ALTER TABLE four_seasons3 MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two4 UPDATE INDEXES;

如果不显式声明 UPDATE INDEXES 语句,就必须给受影响的分区 rebuild the local index.

1 -- Rebuild index for quarter_two, which has been marked unusable2 -- because it has not had all of the data from Q1 added to it.3 -- Rebuilding the index will correct this.4 ALTER TABLE four_seasons MODIFY PARTITION5 quarter_two REBUILD UNUSABLE LOCAL INDEXES;

合并Interval Partitions 同RANGE一样,必须两个相邻分区才能合并

合并List partitions则没有限制

五、分割分区

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

1、range类型分区的分割

1 ALTER  TABLE range_example2 SPLIT PARTITION part013      AT (TO_DATE('2008-06-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))4 INTO ( PARTITION part01_1,PARTITION part01_25 );

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

2、List类型分区的分割

1 ALTER  TABLE list_example2 SPLIT PARTITION part01 VALUES('ME','PE')3 INTO ( PARTITION part01_1, PARTITION part01_24 );

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

1 ALTER  TABLE range_hash_example SPLIT PARTITION part_12 AT (TO_DATE('2008-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) INTO (3 PARTITION part_1_1 SUBPARTITIONS 2 STORE IN (tbs01,tbs02),4 PARTITION part_1_25 );

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

六、Exchanging Partitions

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

如下:

1 CREATE TABLE hash_part02 AS SELECT * FROM hash_example WHERE 1=2;2 ALTER TABLE hash_example EXCHANGE PARTITION part02 WITH TABLE hash_part02;

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

七、索引

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

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

以表range_example为例。

1.建立普通的索引
1 create index com_index_range_example_id on range_example(id);

2.建立本地分区索引

1 create index  local_index_range_example_id on range_example(id) local;

3.建立全局分区索引

1 create index gidx_range_exampel_id on range_example(id)2 GLOBAL  partition by  range(id)3 (4   part_01 values less than(1000),5   part_02 values less than(MAXVALUE)6 );

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

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

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

转载于:https://www.cnblogs.com/devlin/articles/3499307.html

你可能感兴趣的文章
在 mvc4 WebApi 中 json 的 跨域访问
查看>>
敏捷开发文章读后感
查看>>
xposed获取context 的方法
查看>>
html5 canvas 图像处理
查看>>
He who hesitates is Lost
查看>>
多少个1能被2009整除
查看>>
第一个Django页面(2)
查看>>
微信菜单创建
查看>>
js 实现论坛评论模块原理
查看>>
MyEclipse Workspace编码与网页/编辑器 中文乱码问题
查看>>
c++函数回顾
查看>>
【深度学习最优化方法】
查看>>
弹出框始终保持居中(包括有滚动条和窗体缩放时)
查看>>
C#访问数据库增删查改代码
查看>>
mysql 8小时超时设置
查看>>
安卓真机ADB shell添加slite3命令
查看>>
php中引用&的真正理解-变量引用、函数引用、对象引用
查看>>
关于<form> autocomplete 属性
查看>>
OutOfMemory
查看>>
LeetCode:组合总数III【216】
查看>>