海量數據庫及分區4

管理分區
增加索引分區
本地索引無法明確的增加分區,其增加只能是基表增加分區,此時新增加的索引分區的名字是Oracle自命名的,但可以給其重新命名。
也可是使用ALTER INDEX index_name MODIFY DEFAULT ARRTIBUTES  TABLASEPACE tablespace_name修改本地索引分區默認的表空間後,再使用ADD PARTITION增加表的分區,則基表增加分區帶來索引分區的增加,會自動將新增加的索引分區指向該表空間。
接合分區
  分區接合是針對散列分區或者*-散列子分區的,目的是減少分區數。當某個散列分區接合後,Oracle將其分區的數據分散到其它分區中。被接合的分區是由數據庫選擇的,接合完成後該分區會被刪除,且如果沒有使用UPDATE INDEX子句,本地索引和全局索引均將變成不可用,一般需要重建索引。
1.散列分區表的散列分區接合
  使用語法 ALTER TABLE  COALESCE PARTITION。
 
2.散列子分區表的散列子分區集合
  使用語法 ALTER TABLE MODIFY PARTITION  COALESCE SUBPARTITION。                        參見附件腳本1
 
刪除表分區
  只針對範圍和列表分區或者組合*-範圍和組合*-列表分區,散列分區不能刪除,替代的方式是接合分區。
分區或子分區刪除後,其中的數據也被刪除,同樣,基於這些分區或者子分區的本地索引中相應的分區和子分區也會被刪除;對於全局索引除非使用了UPDATE INDEXS子句,刪除分區後其會變成不可用,一般需要重構。如果要防止數據被刪除替代的方式是使用合併分區MERGE PARTITION。
刪除分區的語句是ALTER TABLE DROP PARTITION,刪除子分區的語句時ALTER TABLE DROP SUBPARTITION。
1.從包含數據和全局索引的表中刪除分區
  此時指的是表中有數據,且包含一個或幾個全局索引。
  (1).方法一(推薦的方法)
    先刪除分區,再一個個的重構全部索引,此時可以解決範圍分區的全局索引的問題(刪除後全部變成不可用)。這麼做的原因是不要考慮全局索引是什麼分區的。一般的方法是編寫一個工具子程序,通過動態SQL開重構索引:
  ALTER TABLE table_name DROP PARTITION partition_name;
ALTER INDEX index_name1_on_ table_name REBUILD;
  …
 ALTER INDEX index_namen_on_ table_name REBUILD;
(2).方法二
    先刪除該分區的數據(因爲刪除數據會重構全局分區),再刪除分區,一般針對數據不是特別多的表:
  DELETE FROM table_name PARTITION(partition_name);
ALTER TABLE table_name  PARTITION partition_name;
(3).方法三
    使用UPDATE INDEXES子句,此時Oracle會自動重構該全局索引:
     ALTER TABLE table_name  PARTITION partition_name UPDATE INDEXES;
 
2.從包含數據和參照完整性(外鍵)的表中刪除分區
  (1).方法一
    如果要刪除的分區中的數據沒有被參照引用,先禁用該參照完整性約束,再刪除分區,最後再啓用該參照完整性約束。
(2).方法二
如果要刪除的分區中的數據被參照引用,先刪除該分區中數據,再刪除分區。
刪除索引分區
無法顯式的刪除本地索引的分區,刪除的唯一方式是本地索引分區基表的分區被刪除時由Oracle自動的隱式刪除。 
如果全局索引分區是空的,則可以顯式的刪除它,使用的語句是ALTER INDEX index_name DROP PARTITION partition_name。但是,如果全局索引分區包含數據,刪除則會引起更高級的分區(即下一個分區)變得不可用。如果非要這麼做,則對更高級的分區需要重構,語法是:
 ALTER INDEX index_name REUBILT PARTITION nextpartition_name
  
交換分區
 
   可以將一個分區(子分區)和非分區表進行數據交換,oracle交換的方法是其實是對邏輯存儲段進行交換。同樣,散列|範圍|列表分區可以與複合*-散列|*-範圍|*-列表分區間也可以進行數據交換。當應用中需要將非分區表的數據轉換進入分區表的分區時非常高效實用。使用INCLUDEING INDEXES子句可以同步將本地索引也進行交換,使用WITH VALIDATATION子句還可以實現行數據的驗證。
交換分區時如果不帶UPDATE INDEXES子句,則全局索引或全局索引基於的分區將變爲不可用。
1.三種單級分區與非分區表的交換
使用ALTER TABLE table_name EXCHANGE PARTITION partition_name WITH TABLE nonpartition_name
交換前:
  
1.三種單級分區與非分區表的交換
交換後:
如再次交換,則二者的數據會再次互換,變成第一次交換前的狀態
 
2. 單級散列分區表與複合*-散列分區的交換
此時要求單級散列分區表的分區鍵與複合*-散列分區表的子分區鍵相同,且兩個交換的散列分區數也得相同,此外也不能指定單級散列分區表的某一個分區進行交換。
交換前:
 
 
2. 單級散列分區表與複合*-散列分區的交換
交換後:
  
再交換後,回到原始狀態:
  
參見附件腳本3
 
 
3. 複合*-散列分區中的散列子分區交換
   使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分區表進行交換,且只能跟非分區表進行交換。 參見附件腳本4
交換前:
 
交換後:
 
 
4.單級列表分區表與複合*-列表分區的交換
   此時要求List分區表的分區鍵和*-List表的子分區鍵相匹配,前者的List分區數與後者的List子分區相同。 參見附件腳本5
5. 複合*-列表分區中的列表子分區交換
同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分區表進行交換,且只能跟非分區表進行交換。參見附件腳本6
6.單級範圍分區表與複合*-範圍分區的交換
此時要求Range分區表的分區鍵和*-Range表的子分區鍵相匹配,前者的Range分區數與後者的Range子分區相同。 參見附件腳本7
7. 複合*-範圍分區中的範圍子分區交換
    同樣也是使用ALTER TABLE ... EXCHANGE SUBPARTITION與非分區表進行交換,且只能跟非分區表進行交換。 參見附件腳本
列表分區值的增加 
僅有列表分區或列表子分區存在該功能,如果要增加的值在其它分區或者當前分區的其它子分區中存在,則不能增加,因此對於存在default的List分區/子分區,本功能不可用。本操作完成後,本地索引和全局索引保留爲可用。 參見附件腳本9 
1.列表分區
 ALTER TABLE table_name MODIFY PARTITION partition_name
 ADD VALUES
2.列表子分區
ALTER TABLE table_name MODIFY SUBPARTITION subpartition_name
 ADD VALUES
 
列表分區值的刪除
 
也是僅有列表分區或列表子分區存在該功能,如果要刪除的值在當前分區子分區中存在,則不能報錯,必須先刪除該值對應的記錄才能再刪除,如果一個分區中只有一個值,無論其有否數據,也不能刪除該值,因此對於存在default的List分區/子分區,本功能不可用。本操作完成後,本地索引和全局索引保留爲可用。 參見附件腳本10
1.列表分區
 ALTER TABLE table_name MODIFY PARTITION partition_name
 DROP VALUES
2.列表子分區
ALTER TABLE table_name MODIFY SUBPARTITION subpartition_name
 DROP VALUES
 
移動分區
移動分區的作用包括:
 
l重新聚合數據,以減少碎片
l將分區移動到另外一個表空間(MODIFY命令搞不定)
l修改“建立時間”屬性
l對有壓縮屬性的,將數據壓縮後存儲,因此對壓縮分區表分寫入後需要調用本命令
 
一般來說,該命令執行完後,本地索引和全局索引變成不可用,需要重新構建。
1.移動表分區
 ALTER TABLE table_name MOVE PARTITION partition_name
 [TABLESPACE new_tablespace_name][NOLOGGING|LOGGING][COMPRESS]
 
1.移動表分區
 ALTER TABLE table_name MOVE PARTITION partition_name
 [TABLESPACE new_tablespace_name][NOLOGGING|LOGGING][COMPRESS];
執行該命令後,即使沒有指定新的表空間,也會刪除舊的分區段,創建一個新的分區段。
2.移動子分區
針對複合分區表,同上,關鍵字改成SUBPARTIOTION  subpartition_name,此外此時只能移動子分區,對分區的移動是非法的。
3.移動索引分區
切記不要通過MOVE指令來執行,雖然Oracle支持,建議一律先刪除索引再重建。
參見附件腳本11
 
 
 
重構索引分區
重構索引分區的理由一般包括:
l恢復空間或改善性能
l修復因介質原因而損壞的索引分區
l通過SQL*Loader或導入工具裝載數據後重構本地索引
l重構被標記爲UNUSABLE的索引分區
l啓用b-tree索引中的鍵壓縮
1.重構全局索引分區
有以下兩種方法:
(1).ALTER INDEX index_name REBUILD PARTITION partition_name
  (2).刪除索引,再重建。推薦這種方法
  參見附件腳本12.1
 
 
2.重構本地索引分區  參見附件腳本12.2
有以下兩種方法:
(1).ALTER INDEX index_name  REBUILD
       {PARTITION partition_name| SUBPARTITION subpartition_name}
  (2). ALTER TABLE table_name  MODIFY
       [{PARTITION partition_name| SUBPARTITION subpartition_name}
       REBUILD UNUSABLE LOCAL INDEXES
       
重命名分區
 
使用重命名分區有兩種需求,一種是將分區名改成更有意義的,第二種是將系統自動生成的分區名改成自己想要的名字。
1.重命名分區/子分區
  ALTER TABLE table_name RENAME PARTITION old_name TO new_name;
  ALTER TABLE table_name RENAME SUBPARTITION old_name TO new_name;
2.重索引分區
  除關鍵字改成ALTER TABLE table_name 改成ALTER INDEX index_name外,其它同重命名分區/子分區
 
 
參見附件腳本13
 
 
拆分分區
 
當一個分區變得很大時會帶來備份、恢復和維護操作的長時性,此時可以對分區進行拆分,拆分可以將一個分區拆分成兩個,拆分的分區如果包含數據,完成拆分後索引會變得不可用,一般需要重構。
1.拆分Range分區表的Range分區
  ALTER TABLE table_name SPLIT PARTITION partition_name
  AT(values) INTO(PARTITION new_ partition_name1,                   
                  PARTITION new_partition_name2);
  其中拆分完分區後的第一個分區的值小於AT值,第二個小於原來分區的值。如果拆分完的分區沒有指定名字,系統使用SYS_Pn自動命名。拆分完成後如果存在索引,還需要重構。
參見附件腳本14.1
 
2.拆分List分區表的List分區
  ALTER TABLE table_name SPLIT PARTITION partition_name
  VALUES(values) INTO(PARTITION new_ partition_name1,                   
                  PARTITION new_partition_name2);
  其中values值是定義中枚舉值範圍的子集,該值寫入到拆分後的第一個分區,未包含的寫入到第二個分區。也可以對default分區進行拆分,方法同上。
 
參見附件腳本14.2
 
3.拆分*-hash分區表的的分區
 
子分區可以採用SUBPARTITIONS n方式,也可以採用PARTITION partition_name方式。如果不指定SUBPARTITION子句,則從父分區去繼承子分區數。需要注意的是拆分時繼承的屬性與合併時不同,合併時繼承的是表級的屬性,原因是合併時有兩個父分區。其中關鍵字values或at取決於分區的類型,即range爲at,list爲values
參見附件14.3
 
 
4.拆分*-List分區表的分區
  此時分區級和子分區級均可拆分
(1).拆分*-List分區
如果是R-L類型,則與拆分範圍分區類似,如果是L-L類型,則跟拆分列表分區類似。無需指定子分區語句,子分區屬性從拆分的父分區處繼承,此時拆分後新子分區的名字無法指定。
(2).拆分*-List子分區
  ALTER TABLE table_name SPLIT SUBPARTITION subpartition_name
  VALUES(values) INTO(SUBPARTITION new_subpartition_name1,                   
                  SUBPARTITION new_subpartition_name2);
參見附件腳本14.4
 
 
5.拆分*-Range分區表的分區   參見附件腳本14.5
  此時也是分區級和子分區級均可拆分,新分區的子分區的範圍值不可指定,新分區的子分區屬性繼承自父分區。
(1).拆分*-Range分區
如果是R-R類型,則與拆分範圍分區類似,如果是L-R類型,則跟拆分列表分區類似。無需指定子分區語句,子分區屬性從拆分的父分區處繼承,此時拆分後新子分區的名字無法指定。
(2).拆分*-Range子分區
  ALTER TABLE table_name SPLIT SUBPARTITION subpartition_name
  AT(values) INTO(SUBPARTITION new_subpartition_name1,                   
                  SUBPARTITION new_subpartition_name2);
 
 
6.拆分索引分區
  本地索引分區無法顯式的拆分,其拆分的唯一途徑是基表的分區拆分時由Oracle隱式的進行拆分。
全局索引分區可以拆分,拆分完成後需要重構,但我們不推薦這麼做,如下例:
ALTER INDEX quon1 SPLIT
PARTITION canada AT ( 100 ) INTO
PARTITION canada1 ...,
PARTITION canada2 ...);
ALTER INDEX quon1 REBUILD PARTITION canada1;
ALTER INDEX quon1 REBUILD PARTITION canada2;
 
 
清空分區
 
   使用ALTER TABLE table_name TRUNCATE {PARTITION partition_name| SUBPARTITION subpartition_name}清空分區會清除掉分區中的數據,類似清空表。但是索引分區不可清空,清空分區同步會清空索引分區在該分區的數據。
1.清空表分區
會清空分區數據,但不會回收空間,有兩種情況:
(1).包含數據和全局索引的分區
  方法一是先清空該分區再重構基於該分區的全局索引;第二種方法是先刪除該分區的數據再清空該分區;第三種方法是使用UPDATE INDEXES子句。推薦第二種方式。
 
 
1.清空表分區
(2).包含數據和代參考完整性約束的分區
  方法一先禁用該約束再清空分區最後啓用該約束;第二種方法是先刪除該分區的數據再清空該分區。推薦第一種方式。
2.清空子分區
直接使用該語句,同步的本地索引數據也會刪除。
 
 
 
相關數據字典
視圖
說明
視圖
說明
DBA_PART_TABLES
ALL_PART_TABLES
USER_PART_TABLES
分區表
DBA_TAB_PARTITIONS
ALL_TAB_PARTITIONS
USER_TAB_PARTITIONS
分區
DBA_TAB_SUBPARTITIONS
ALL_TAB_SUBPARTITIONS
USER_TAB_SUBPARTITIONS
子分區
DBA_PART_KEY_COLUMNS
ALL_PART_KEY_COLUMNS
USER_PART_KEY_COLUMNS
分區鍵
DBA_SUBPART_KEY_COLUMNS
ALL_SUBPART_KEY_COLUMNS
USER_SUBPART_KEY_COLUMNS
 
子分區鍵
DBA_PART_COL_STATISTICS
ALL_PART_COL_STATISTICS
USER_PART_COL_STATISTICS
分區的列和柱狀圖統計信息
 
 
視圖
說明
視圖
說明
DBA_SUBPART_COL_STATISTICS
ALL_SUBPART_COL_STATISTICS
USER_SUBPART_COL_STATISTICS
子分區的列和柱狀圖統計信息
DBA_PART_HISTOGRAMS
ALL_PART_HISTOGRAMS
USER_PART_HISTOGRAMS
分區柱狀圖數據
DBA_SUBPART_HISTOGRAMS
ALL_SUBPART_HISTOGRAMS
USER_SUBPART_HISTOGRAMS
子分區柱狀圖數據
DBA_PART_INDEXES
ALL_PART_INDEXES
USER_PART_INDEXES
分區索引
 
 
按範圍分區和列表分區
 
1.按範圍分區
l大表且對數據的掃描經常按使用範圍時,如日期和時間
l對數據的維護需要使用滾動窗口時,如在數據倉庫中,經常按月度需要裝載最近3年(36個月)的數據。滾動窗口是指一般是週期性的需要裝載新數據並清除舊數據的時間窗口
2.列表分區
l列的取值範圍是離散且可以枚舉時,如按地理區域分區、按流程狀態分區
散列分區
   無明確的按範圍或者列表方式分區時,可考慮在以下情況下使用散列分區:
 
l想要數據均衡分佈,並可啓用部分/全部分區智能連接功能時
l分區鍵作爲主要的唯一值或者值列表時,如使用序列爲主鍵
l想要數據隨機均衡分佈在不同的分區以便規避I/O瓶頸時
 
當一個列或多個列構成唯一值時,使用這些列爲分區鍵來建立散列分區,並且將分區數儘量設置爲2的冪,如2、4、8、16、32等,一般會獲得比較好的性能。
 
1.複合範圍-範圍分區
 
l兩個均能按範圍分區的維度時,如兩個維度的時間(如起始時間、截止時間)
 
2.複合範圍-散列分區
 
l存儲有大量歷史數據,且這些歷史數據經常要跟另外一個大表連接時。如銷售歷史表和客戶表一期關聯對比分析趨勢數據時
l傳統意義上的散列分區數據經常需要滾動操作時,如某個系統訪問的日誌信息,需要統計不同客戶端ip各個時期的各種記錄(如訪問記錄次數、在線時長等)時
 
 
3.複合列表-範圍分區
 
l一般用在第一個維度是枚舉值,第二個維度是範圍值時,如捐贈數額表,可以先按幣種列表分區,再按金額範圍分區
 
4.複合列表-散列分區
 
l通常用在第一個維度是枚舉值,第二個維度無法按範圍或列表分區時,如某個信用卡記錄表,可以先按區域列表分區、再按卡號進行散列分區
 
 
5.複合列表-列表分區 
l一般用兩個維度都是不連續的離散值時,如前述信用卡賬戶表,可以先按區域列表分區,再按省份或賬戶類型(白金卡、金卡、銀卡、普通卡等)列表分區
 
習題
1.本地分區索引的分區可以增加嗎,爲什麼?
2.散列分區要減少分區數如何處理?範圍分區和列表分區呢?請試着舉例說明。
3.假定表A基於列colA有3個範圍單擊分區,且建立了一個全局分區索引,表中有數據,如果要刪除某個分區,有幾種方法?
4.本地索引分區可以刪除嗎,爲什麼?如果某個表存在全局分區索引,刪除某個分區後,需要接下來執行什麼操作,爲什麼?
5.單級散列分區表與複合*-散列分區交換時,需要滿足什麼條件?
6.舉例說明覆合*-散列分區中的散列子分區交換爲什麼只能跟非分區表進行交換。
7.對分區執行移動操作的兩大主要目的是什麼?
8.列表歸納各種分區的拆分限制條件,並舉例說明其語法。
9.散列分區、範圍分區、*-Hash和*-List分區分別建議在什麼情況下使用?
10.練習本課程的分區管理操作,增強對分區管理的直觀理解。
 
 轉載請註明私塾在線【 http://sishuok.com/forum/blogPost/list/0/6411.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章