聊聊分割槽Partition——我們為什麼要分割槽(中)

bitifi發表於2015-11-07

 

上篇我們介紹了Oracle分割槽表在效能方面的優勢,本篇集中在管理層面,討論下管理層面的優勢。

 

4、管理便捷性

 

相對於一個大資料物件(資料表、索引),分割槽化首先給我們帶來的就是管理便捷。一個很大的資料表,無論是進行資料表重構,還是儲存位置操作,都會面臨連帶負載問題。在生產環境下,這種負載變化尤其是我們希望避免的。

藉助分割槽,我們可以將大物件劃分為一系列小物件進行單獨處理。也就是將一個突然性的大操作轉變為一系列的小規模操作進行,從而減少對其他正在執行作業的影響。

下面是資料表T_PART,對應的本地索引。

 

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             SYSTEM

P2                             SYSTEM

P3                             SYSTEM

 

SQL> select partition_name, status from dba_ind_partitions where index_owner='SYS' and index_name='IDX_T_PART_IDP';

 

PARTITION_NAME                 STATUS

------------------------------ --------

P1                             USABLE

P2                             USABLE

P3                             USABLE

 

當我們需要調整一個資料表分割槽的表空間,到users表空間,我們可以使用單獨的命令進行處理,而不會影響到其他資料。

 

 

SQL> alter table t_part move partition p1 tablespace users;

Table altered

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             USERS

P2                             SYSTEM

P3                             SYSTEM

 

針對分割槽索引,如果出現失效的情況,我們也是可以進行部分rebuild

 

 

SQL> select partition_name, status from dba_ind_partitions where index_owner='SYS' and index_name='IDX_T_PART_IDP';

 

PARTITION_NAME                 STATUS

------------------------------ --------

P1                             UNUSABLE

P2                             USABLE

P3                             USABLE

 

SQL> alter index idx_t_part_idp rebuild partition p1;

 

Index altered

 

SQL> select partition_name, status from dba_ind_partitions where index_owner='SYS' and index_name='IDX_T_PART_IDP';

 

PARTITION_NAME                 STATUS

------------------------------ --------

P1                             USABLE

P2                             USABLE

P3                             USABLE

 

此外,Oracle提供的很多針對分割槽的操作,比如匯出特定分割槽資料、刪除分割槽資料等,都是管理便捷性的體現。

 

5、資料刪除

 

對大資料表,資料退出生命週期之後,就可以從資料表中進行刪除。從資料活躍性理論角度看,任何資料在資料表中都是有生命週期的,一旦經過了業務處理高峰期,就應該會在某個特定標準框架下被刪除。

大資料量刪除是應用運維領域一個比較麻煩的事情。因為通常情況下,刪除資料總數雖然很大,但是往往佔到全部資料表比例不高。比如,每次Purge資料,可能都是資料表中最老的一週資料,而資料表中包括了近三個月資料。

一種結合設計的手段是將分割槽融入到過程中,將一次刪除的資料放在相同的分割槽上,這樣有兩個好處。一個是可以將活性相同的資料放在相同位置上,避免低活性資料的影響。另一個是可以藉助分割槽層次上的操作手段,快速進行資料刪除操作。

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             USERS

P2                             SYSTEM

P3                             SYSTEM

 

SQL> set timing on;

SQL> alter table t_part drop partition p3;

 

Table altered

 

Executed in 0.453 seconds

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             USERS

P2                             SYSTEM

 

Executed in 0.015 seconds

 

注意:Drop Partition操作和普通的delete是有顯著性區別的。Delete操作的核心在於“打標記”。Server Process檢索所有符合條件的資料記錄,標記為刪除。這個過程的時間往往和資料量相關。

Drop Partition是一個DDL過程,這個過程中,資料並沒有被刪除,而是資料表的分割槽定義發生了變化,讓Oracle“不再承認”分割槽的存在。這種方法刪除資料和Truncate Table有相似之處。優點是速度快,適合大資料分割槽表的刪除動作。

作為提醒注意一下,對於drop partition操作,Global IndexLocal Index的行為是有差異的,這一點和上面move操作的結果相同。如果是Local Index,其他分割槽的變化並不影響本分割槽的索引作用。所以,Local Index還是存在的。但是,Global Index由於結構上的特殊性,需要進行額外的rebuild操作。

當然,我們可以在drop partition的時候,連帶加入update global indexes字句到drop partition命令中,實現自動的global索引重構。

 

 

SQL> create index idx_t_part_idg on t_part(object_name);

Index created

 

Executed in 0.983 seconds

 

SQL> alter table t_part drop partition p2 update global indexes;

Table altered

 

Executed in 0.609 seconds

 

SQL> select status from dba_indexes where owner='SYS' and index_name='IDX_T_PART_IDG';

STATUS

--------

VALID

 

Executed in 0.031 seconds

 

 

6、資料歸檔

 

歸檔Archive和刪除是有一些差別的。刪除表示的是資料不再需要,可以直接永久刪除。實際生產環境中,直接刪除的情況是比較少的,大部分情況是需要保留一個備份資料。只是將這個備份資料Offline出系統範圍。

這個時候,使用分割槽資料表技術,可以快速的進行歸檔動作,解除安裝資料。先準備資料。

 

SQL> drop table t_part;

Table dropped

 

Executed in 1.03 seconds

 

SQL> create table t_part

  2  partition by list (owner)

  3  (

  4     partition p1 values('SYS'),

  5     partition p2 values('PUBLIC'),

  6     partition p3 values(default)

  7  )

  8  as

  9  select * from dba_objects;

 

Table created

 

Executed in 1.856 seconds

 

我們希望歸檔P2資料,可以先建立一個空資料表作為載體。

 

 

SQL> create table t_arch_p2 as select * from t_part where 1=0;

Table created

 

Executed in 0.094 seconds

 

 

SQL> alter table t_part exchange partition p2 with table t_arch_p2;

 

Table altered

 

Executed in 0.094 seconds

 

SQL> select count(*) from t_arch_p2;

 

  COUNT(*)

----------

     27703

 

Executed in 0.047 seconds

 

Exchange partition操作是一種非常強大的工具。語句基於操作定義層面的變化,將資料分割槽和資料表定義轉換。所以,exchange partition操作的速度是非常有優勢的。

將分割槽拆分出資料表t_part,到t_arch_p2獨立資料表之後,我們接下來可以將其匯出資料庫或者備份到其他裝置上。

下面我們繼續看其他管理方面分割槽的用法。

 

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

相關文章