<p>
<span lang="EN-US">Oracle</span>提供了分区技术以支持<span lang="EN-US">VLDB(Very Large DataBase)</span>。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。
</p>
<p>
<span lang="EN-US">Oracle</span>的分区表可以包括多个分区,每个分区都是一个独立的段(<span lang="EN-US">SEGMENT</span>),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。
</p>
<div>
<p style="background-color:#FFFFFF;color:#8A8679;font-family:'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53;font-size:16px;">
<span style="background-color:inherit;font-size:x-small;"></span>
</p>
<br />
</div>
<div>
分区的优点:
</div>
<p>
(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;
</p>
<p>
(2)可以对单独的分区进行备份和恢复;
</p>
<p>
(3)可以将分区映射到不同的物理磁盘上,来分散IO;
</p>
<p>
(4)提高可管理性、可用性和性能。
</p>
<div>
<p style="background-color:#FFFFFF;color:#444444;font-family:Arial;font-size:14px;">
<br />
</p>
<div style="background-color:#FFFFFF;font-family:微软雅黑;font-size:14px;">
分区表和分区索引(About Partitioned Tables and Indexes)的种类<br style="background-color:inherit;" />
</div>
</div>
<b>Range分区:</b>
<div>
Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。
</div>
<p>
<span lang="zh-CN"> INTERVAL分区是Oracle11g新增的特性,它是针对</span><span lang="en-US">Range</span><span lang="zh-CN">类型分区的一种功能拓展。对连续数据类型的</span><span lang="en-US">Range</span><span lang="zh-CN">分区,如果插入的新数据值与当前分区均不匹配,</span><span lang="en-US">Interval-Partition</span><span lang="zh-CN">特性可以实现自动的分区创建。</span>
</p>
<div>
<p>
<b>Hash分区:</b>
</p>
<p>
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。
</p>
<p>
<br />
</p>
<p style="background-color:#FFFFFF;color:#444444;font-family:Arial;font-size:14px;">
<br />
</p>
<p>
<br />
</p>
</div>
<p>
<b>List分区:</b>
</p>
<p>
List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。
</p>
<p>
<b>组合分区:</b>
</p>
<p>
如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。组合分区呢在10g中有两种:range-hash,range-list。注意顺序,根分区只能是range分区,子分区可以是hash分区或list分区。
</p>
<p>
<br />
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
<br />
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
<b style="color:#000000;font-family:微软雅黑;font-size:14px;">Range示例:</b>
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
<b style="color:#000000;font-family:微软雅黑;font-size:14px;">创建range分区表:</b>
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
create table range_tab (id varchar(100),my_date date)
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
partition by range(my_date)
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
(
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
partition p1 values less than(to_date('2015-10-1', 'yyyy-mm-dd')) tablespace test,
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
partition p2 values less than(to_date('2015-11-1', 'yyyy-mm-dd')) tablespace test,
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
partition p3 values less than(to_date('2015-12-1', 'yyyy-mm-dd')) tablespace test,
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
partition p4 values less than(maxvalue)
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
)
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
<br />
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
select * from user_part_tables;
</p>
<p style="background-color:#FFFFFF;color:#333333;font-family:Arial;font-size:12pt;">
select * from user_tab_partitions;
</p>
<div>
<br />
</div>
<div>
<b>添加range分区</b>
</div>
1、原分区里边界是maxvalue或者default。这种情况下,需要把边界分区drop掉,加上新分区后,在添加上新的分区。 或者采用split,对边界分区进行拆分。
<div>
<div>
alter table range_tab add partition p5 values less than(to_date('2016-01-01', 'yyyy-mm-dd')) tablespace test ;
</div>
<div>
ERROR at line 1:
</div>
<div>
ORA-14074: partition bound must collate higher than that of the last partition
</div>
<div>
<br />
</div>
<div>
alter table range_tab split partition <span style="color:#ff0000;">p4</span> at(to_date('2016-02-01', 'yyyy-mm-dd'))
</div>
<div>
into (partition p5 tablespace fog,partition <span style="color:#ff0000;">p4 </span>tablespace fog)
</div>
<div>
2、原分区里边界没有maxvalue或者default。直接添加分区即可
</div>
<div>
alter table range_tab add partition p5 values less than(to_date('2016-01-01', 'yyyy-mm-dd')) tablespace test ;<br style="background-color:inherit;" />
</div>
<div>
<br style="background-color:inherit;" />
</div>
<div>
<b>删除range分区</b>
</div>
<div>
alter table range_tab drop partition p5;
</div>
<div>
<br />
</div>
<div>
<b>将range分区替换成interval类型的range分区</b>
</div>
<div>
原分区里边界是maxvalue或者default。需要删除该分区。<br />
</div>
<div>
alter table range_tab set interval(numtoyminterval(1,'month'));
</div>
<div>
将interval分区设置成手动分区
</div>
<div>
alter table range_tab set interval();<br style="background-color:inherit;" />
</div>
<p>
<br />
</p>
<p>
<br />
</p>
<p style="background-color:#FFFFFF;color:#444444;font-family:Arial;font-size:14px;">
<br />
</p>
<div>
<br />
</div>
<div>
<b>添加range分区索引</b>
</div>
<div>
<b>global类型的,维护教麻烦,建议使用local类型的</b>
</div>
<div>
create index range_tab_id_index1 on range_tab(my_date)
</div>
<div>
global partition by range(my_date)(
</div>
<div>
partition p1 values less than(to_date('2015-10-1', 'yyyy-mm-dd')) tablespace test,
</div>
<div>
partition p2 values less than(to_date('2015-11-1', 'yyyy-mm-dd')) tablespace test,
</div>
<div>
partition p3 values less than(to_date('2015-12-1', 'yyyy-mm-dd')) tablespace test,
</div>
<div>
partition p4 values less than(to_date('2016-01-1', 'yyyy-mm-dd')) tablespace test,
</div>
<div>
partition p5 values less than(maxvalue) tablespace test
</div>
<div>
)
</div>
<div>
create index range_tab_id_index1 on range_tab(id,my_date) local;
</div>
<div>
local索引也可以知道分区名和对应的表空间名,但是要注意分区个数必须与表的分区个数想一致
</div>
<div>
create index range_tab_id_index on range_tab(id,my_date) local
</div>
<div>
(
</div>
<div>
partition p1 tablespace test,
</div>
<div>
partition p2 tablespace test,
</div>
<div>
partition p3 tablespace test,
</div>
<div>
partition p4 tablespace test,
</div>
<div>
partition p5 tablespace test,
</div>
<div>
partition p6 tablespace test,
</div>
<div>
partition p7 tablespace test,
</div>
<div>
partition p8 tablespace test
</div>
<div>
)
</div>
<div>
有关分区索引视图
</div>
<div>
<p style="font-family:Arial;font-size:12pt;color:#333333;">
select * from user_part_indexes;
</p>
<p style="font-family:Arial;font-size:12pt;color:#333333;">
select * from user_ind_partitions;
</p>
<p style="font-family:Arial;font-size:12pt;color:#333333;">
<br />
</p>
<p style="font-family:Arial;font-size:12pt;color:#333333;">
<b style="font-family:微软雅黑;font-size:14px;line-height:1.5;">hash分区</b>
</p>
<p style="color:#333333;">
<b style="background-color:inherit;">创建hash分区</b>
</p>
</div>
</div>
<p>
create table hash_tab (id varchar(20),hash_value varchar2(50))
</p>
<p>
partition by hash(id)(
</p>
<p>
partition p1 tablespace test,
</p>
<p>
partition p2 tablespace test,
</p>
<p>
partition p3 tablespace test);
</p>
<div>
<p style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;">
<br />
</p>
需要注意的是hash分区不存在split和drop操作,只能add分区,数据在各个分区的分布情况并不由我们控制,而是通过oracle中的hash函数来操作的,所以我们不能显示的指定某一个分区进行分裂。
</div>
<div>
<div>
</div>
<div>
alter table hash_tab add partition p4 tablespace test;
</div>
<div>
<br style="background-color:inherit;" />
</div>
<div>
创建global类型的hash索引
</div>
<div>
create index hash_tab_id_index on hash_tab(id)
</div>
<div>
global partition by hash(id)(
</div>
<div>
partition p1 tablespace test,
</div>
<div>
partition p2 tablespace test,
</div>
<div>
partition p3 tablespace test
</div>
<div>
)
</div>
<div>
<br style="background-color:inherit;" />
</div>
<div>
创建local类型的hash索引
</div>
<div>
create index hash_tab_id_index on hash_tab(id) local;
</div>
<div>
<br />
</div>
<div>
<b style="background-color:inherit;">list分区</b>
</div>
<div>
<b style="background-color:inherit;">创建list分区表</b>
</div>
<div>
<b style="background-color:inherit;"></b>
</div>
</div>
<div>
create table list_tab(id varchar2(20),list_data varchar2(50))
</div>
<div>
partition by list(id)(
</div>
<div>
partition p1 values('001'),
</div>
<div>
partition p2 values('002'),
</div>
<div>
partition p3 values('003'),
</div>
<div>
partition p4 values(default)
</div>
<div>
)
</div>
<div>
<div>
<p style="background-color:inherit;">
<br />
</p>
拆分一个list分区
</div>
<div>
alter table list_tab split partition p4 values ('004')
</div>
<div>
into (partition p5 tablespace test,partition p4 tablespace test);
</div>
<div>
删除一个list分区
</div>
<div>
alter table list_tab drop partition p5;
</div>
<div>
添加一个list分区(分区里边界不能有maxvalue或者default)
</div>
<div>
alter table list_tab add partition p5 values('008');
</div>
<div>
<br style="background-color:inherit;" />
</div>
<div>
<b style="background-color:inherit;"></b>
</div>
</div>
<b>组合分区:</b>
<div>
如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。<br />
</div>
组合分区主要有两种:range-hash,range-list。
<div>
<br />
</div>
<div>
<b style="background-color:inherit;">range-hash</b><br />
</div>
<div>
create table range_hash_tab
</div>
<div>
(
</div>
<div>
id varchar2(20),
</div>
<div>
t_date date
</div>
<div>
)
</div>
<div>
partition by range(t_date) subpartition by hash(id)
</div>
<div>
subpartition template
</div>
<div>
(
</div>
<div>
subpartition sub_p1 tablespace test,
</div>
<div>
subpartition sub_p2 tablespace test,
</div>
<div>
subpartition sub_p3 tablespace test
</div>
<div>
)
</div>
<div>
(
</div>
<div>
partition p01 values less than(to_date('2015-01-01','yyyy-mm-dd')),
</div>
<div>
partition p02 values less than(to_date('2016-01-01','yyyy-mm-dd')),
</div>
<div>
partition p03 values less than(maxvalue)
</div>
<div>
);
</div>
<div>
<div>
或者
</div>
<div>
create table range_hash_tab
</div>
<div>
(
</div>
<div>
id varchar2(20),
</div>
<div>
t_date date
</div>
<div>
)
</div>
<div>
partition by range(t_date) subpartition by hash(id)
</div>
<div>
subpartition template
</div>
<div>
(
</div>
<div>
subpartition sub_p1 tablespace test,
</div>
<div>
subpartition sub_p2 tablespace test,
</div>
<div>
subpartition sub_p3 tablespace test
</div>
<div>
)
</div>
<div>
(
</div>
<div>
partition p01 values less than(to_date('2015-01-01','yyyy-mm-dd')),
</div>
<div>
partition p02 values less than(to_date('2016-01-01','yyyy-mm-dd')),
</div>
<div>
partition p03 values less than(maxvalue)
</div>
<div>
);
</div>
<p>
<br />
</p>
<div>
<p>
<br />
</p>
<p style="background-color:#FFFFFF;color:#444444;font-family:Arial;font-size:14px;">
<br />
</p>
<br />
<p>
<br />
</p>
<div>
<b style="background-color:inherit;">range-list</b>
</div>
<div>
create table range_list_tab
</div>
<div>
(
</div>
<div>
id varchar2(20),
</div>
<div>
t_date date
</div>
<div>
)
</div>
<div>
partition by range(t_date) subpartition by list(id)
</div>
<div>
(partition p01 values less than(to_date('2015-01-01','yyyy-mm-dd'))
</div>
<div>
(
</div>
<div>
subpartition p01_sub01 values('001','002'),
</div>
<div>
subpartition p01_sub02 values('003','004'),
</div>
<div>
subpartition p01_sub03 values('005','006'),
</div>
<div>
subpartition p01_sub04 values(default)
</div>
<div>
),
</div>
<div>
partition p02 values less than(to_date('2015-02-01','yyyy-mm-dd'))
</div>
<div>
(
</div>
<div>
subpartition p02_sub01 values('001','002'),
</div>
<div>
subpartition p02_sub02 values('003','004'),
</div>
<div>
subpartition p02_sub03 values('005','006'),
</div>
<div>
subpartition p02_sub04 values(default)
</div>
<div>
),
</div>
<div>
partition p03 values less than(to_date('2015-03-01','yyyy-mm-dd'))
</div>
<div>
(
</div>
<div>
subpartition p03_sub01 values('001','002'),
</div>
<div>
subpartition p03_sub02 values('003','004'),
</div>
<div>
subpartition p03_sub03 values('005','006'),
</div>
<div>
subpartition p03_sub04 values(default)
</div>
<div>
<span style="font-family:微软雅黑;font-size:14px;line-height:21px;white-space:normal;background-color:#FFFFFF;">));</span><br style="background-color:#FFFFFF;font-family:微软雅黑;font-size:14px;line-height:21px;white-space:normal;" />
</div>
</div>
</div>
<div>
<span style="font-family:微软雅黑;font-size:14px;line-height:21px;white-space:normal;background-color:#FFFFFF;"><br />
</span>
</div>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11857207/viewspace-2125390/
,如需转载,请注明出处,否则将追究法律责任。