Partition介紹
分區就是將一個非常大的table或者index 按照某一列的值,分解為更小的,易於管理的邏輯片段---分區。將表或者索引分割區不會影響SQL語句以及DML語句,就和使用非分區表一樣,每個分區擁有自己的segment,因為,DDL能夠將比較大的任務分解為更小的顆粒。分區表只有定義資訊,只有每個存放資料的分區才有各自的segment。
就好象擁有多個相同列名,列類型的一個大的視圖。
收益
使用資料分割函數,可以提供的收益,可以從下面幾個方面闡述:
效能
可以減少檢索資料的總量,因為擁有partitionpruing 以及partition-wise joins。
partition pruing:當謂詞中(串連條件)帶有partition key的時候,OracleDatabase可以自動的將不需要的partition裁剪掉,不需檢索額外的partition 。
partition-wise joins:兩個表做join的時候,partitionkey 作為串連條件,OracleDatabase可以將串連操作分成多個單表和每個partition的join piece。對於單線程來說,每次join的工作量小了,可以減少系統的開銷。而對於多線程來說,每個join piece 都可以使用多線程,可以加快檢索時間(但是消耗更多的cpu)。
管理
使用分區技術,可以將管理維護大表或者索引的操作,分成多個維護片段,可以更靈活的管理和維護這些schema object。舉個具體的例子來說,這裡有一個裝有重要檔案的重達100公斤的箱子,你需要將它搬到辦公室去,這是非常累的,甚至是無法達成的。但是如果使用了分區技術,等於將100公斤的箱子10等分,這時候,就可以每次搬一個小箱子即可。
可用性
因為分區表中的每個分區在物理層面上都是隔離的------每個分區擁有自己的segment。所以當其中的一個分區停用時候,不會影響另外的分區。
Partition 分類
Partition可以簡單分為範圍、雜湊、列表三種方式。以下說明了每種分區方式的適用情境。
Range Partitioning 適用情境
- 表中的資料經常被執行範圍掃描,比如說訂單時間。這個時候使用Range Partitioning OracleDatabase可以提供Partition pruing 功能,大大減少了查詢時間。
- 維護定期清理的資料,比如說,應用需求,為了保證效率,只要求12個月內的線上資料。如果使用了Range分區,可以在每個月資料來的時候使用分區交換的功能,將新的資料載入到分區表中,然後直接將最老的那個月的資料刪除,或者歸檔。分區使用的是多個segment,所以這些操作都是非常有效率的。如果單表,那麼可能需要dml語句,查詢後再刪除資料,效能非常低下,備份操作也是如此。如果使用Range分區,那麼可能只需要一個ddl語句即可。
- 維護大表資料。一個非常大的表資料的備份,恢複,消耗都是非常巨大的。但是如果使用Range分區,按照時間維護資料的效能將會有很大的提升。比如說備份操作,假設使用資料泵來備份某一個月份的資料,如果是非分區表,需要使用查詢語句。但是如果使用Range分區,則可以省略掉查詢這部分的操作,保證了效率。
Range Partitioning 比較適用時間列,當然也有其他的適用情境,比如說那些連續的Column Value映射的行有特殊意義的,人的年齡、商品價位等。
11g開始,支援一種新的RangePartition方式,Interval partition,它可以根據選項自動建立需要的分區。
List Partitioning適用情境
- 相對於Range Partition ,適合分散的Column Value 映射的行有特殊意義的情況。比如說統計國內資料,可以使用地區來建立分區。這樣可以在載入或者統計地區資料的時候更加有效率。
Hash Partitioning適用情境
- 這個分區比較適合平均I/O的情境。比如說,有一個大表,經常被訪問,那麼大表所在的資料表空間上面的I/O操作將非常頻繁,這個時候可以將Hash Partition 放在不同的資料表空間上(資料表空間在不同的物理磁碟上),平均每個磁碟上面的I/O負載。防止單一磁碟I/O負載過高的情況。(Hash partition 也支援partition pruing ,但這無疑是沒有意義的)