ITPub博客

首页 > 数据库 > Oracle > 分区表 总结

分区表 总结

Oracle 作者:nightgoblin 时间:2016-09-23 16:55:53 0 删除 编辑
<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> &nbsp; &nbsp; Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。 </div> <p> <span lang="zh-CN">&nbsp; &nbsp; 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> &nbsp; &nbsp; 如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。组合分区呢在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掉,加上新分区后,在添加上新的分区。&nbsp;或者采用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&nbsp;<span style="color:#ff0000;">p4</span>&nbsp;at(to_date('2016-02-01', 'yyyy-mm-dd')) </div> <div> into (partition p5 tablespace fog,partition&nbsp;<span style="color:#ff0000;">p4&nbsp;</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> &nbsp; &nbsp; &nbsp; &nbsp;global partition by range(my_date)( </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p1 values less than(to_date('2015-10-1', 'yyyy-mm-dd')) tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p2 values less than(to_date('2015-11-1', 'yyyy-mm-dd')) tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p3 values less than(to_date('2015-12-1', 'yyyy-mm-dd')) tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p4 values less than(to_date('2016-01-1', 'yyyy-mm-dd')) tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p5 values less than(maxvalue) tablespace test &nbsp; &nbsp; </div> <div> &nbsp; &nbsp; &nbsp; &nbsp;) </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> &nbsp; &nbsp; &nbsp; &nbsp;( </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p1 tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p2 tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p3 tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p4 tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p5 tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p6 tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p7 tablespace test, </div> <div> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; partition p8 tablespace test </div> <div> &nbsp; &nbsp; &nbsp; &nbsp;) </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> &nbsp; global partition by hash(id)( </div> <div> &nbsp; &nbsp; &nbsp;partition p1 tablespace test,&nbsp; </div> <div>   &nbsp;partition p2 tablespace test, </div> <div>   &nbsp;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> &nbsp; &nbsp;partition by list(id)( </div> <div> &nbsp; &nbsp; partition p1 values('001'), </div> <div> &nbsp; &nbsp; partition p2 values('002'), </div> <div> &nbsp; &nbsp; partition p3 values('003'), </div> <div> &nbsp; &nbsp; partition p4 values(default) </div> <div> &nbsp; ) </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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2015-08-04

  • 博文量
    1
  • 访问量
    775