Pruning、Reference Partition、Exchange Partition

lusklusklusk發表於2017-08-11
Pruning
分割槽裁剪就是執行計劃裡面的東西,不用自己去設定什麼(select table時不指定的分割槽名的情況下),最佳化器可以自動從FROM和WHERE字句里根據分割槽鍵提取出需要掃描的分割槽,從而避免全表掃描,減少掃描的資料塊,提高效能。相關的欄位dba_tab_partitions.partition_name、dba_tab_partitions.partition_position。

分割槽裁剪分為靜態和動態,靜態分割槽裁剪發生在編譯階段,動態分割槽裁剪發生在執行階段
靜態裁剪:就是oracle知道走哪幾個分割槽,比如where 條件過濾後知道某個分割槽,執行計劃的pstart和pstop顯示具體分割槽號
動態裁剪:如果在解析階段無法知道需要掃描多少分割槽,只有在執行時才能確定,執行計劃的pstart和pstop顯示KEY(SQ)或:BF0000

PARTITION RANGE ALL:掃描所有分割槽(具體哪些分割槽可參考執行計劃中Pstart、Pstop兩個欄位)
PARTITION RANGE SINGLE:掃描單個分割槽(具體哪些分割槽可參考執行計劃中Pstart、Pstop兩個欄位)
PARTITION RANGE ITERATOR:掃描多個分割槽再做分割槽合併(具體哪些分割槽可參考執行計劃中Pstart、Pstop兩個欄位)



Reference Partition
Reference Partition針對的業務場景是主外來鍵關聯。主表分割槽之後,藉助Reference Partition可以實現自動的子表分割槽(不管子表上有無分割槽鍵)。經過Reference Partition分割槽之後,在同一個主表分割槽中的資料記錄,對應到的子表記錄,全部都在相同的子表分割槽上。


Exchange Partition
Exchange Partition就是某個分割槽和實體表進行資料交換,分割槽的資料到了實體表,實體表的資料到了分割槽
You can convert a partition (or subpartition) into a nonpartitioned table, and a nonpartitioned table into a partition (or subpartition) of a partitioned table by exchanging their data segments
其實就是類似改了下資料字典,把分割槽和實體表的segment頭部換了下,資料存放的block沒有動

現實中使用Exchange Partition常見的場景如:比如有兩張分割槽表,一張是歷史表,一張是當前表,需要定期把當前表6個月前的資料匯入歷史表怎麼弄呢?
因為分割槽表無法直接和分割槽表進行資料交換,所以我們可以使用Exchange Partition的功能,使用空的實體表做中轉,把當前表6個月前的一個個分割槽匯入到一個個實體表中,再把一個個實體表的資料匯入歷史表的一個個空的新建分割槽(使用空的實體表原因是,當前表和實體表做Exchange時,不會有資料寫入當前表,Exchange後實體表再和歷史表的空的新建分割槽Exchange時,實體表又變成了空表)

分割槽表A要把一些資料遷移到分割槽表B
1、A表和B表的表結構欄位順序和欄位名稱要一樣
2、如果兩個分割槽都是interval的話,是無法保證兩個分割槽的分割槽名字一樣的
原因是interval是系統自動命名的,中間錶轉移到目標表時,目標表必須存在一個分割槽名字,才能轉換過去,但是目標表的分割槽名字怎麼可能會和源表的分割槽名字一樣呢

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2143415/,如需轉載,請註明出處,否則將追究法律責任。

相關文章