分割槽表 總結

bitifi發表於2015-10-23
<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部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1815863/,如需轉載,請註明出處,否則將追究法律責任。

相關文章