1. 程式人生 > >分割槽表學習筆記(二)--分割槽管理

分割槽表學習筆記(二)--分割槽管理

主要內容:

1、新增新的分割槽

2split 分割槽拆分

3、合併分割槽Merge

4、移動分割槽

5Truncate分割槽

6drop 分割槽

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

1新增新的分割槽

新增新的分割槽有2中情況:

1)原分割槽裡邊界是maxvalue或者default這種情況下,我們需要把邊界分割槽drop掉,加上新分割槽後,在新增上新的分割槽。或者採用split,對邊界分割槽進行拆分。

2)沒有邊界分割槽的。這種情況下,直接新增分割槽就可以了。

以邊界分割槽新增新分割槽示例:

1)分割槽表和索引的資訊如下:

SQL> create table custaddr

(id varchar2(15 byte) not null,

areacode varchar2(4 byte))

partition by list (areacode)

(

partition t_list556 values ('556') tablespace data01,

partition p_other values (default)tablespace data01

);

表已建立。

SQL> create index ix_custaddr_id on custaddr(id)

local (

partition t_list556 tablespace data01,

partition p_other tablespace data01

);

索引已建立。

2)插入幾條測試資料:

SQL> insert into custaddr values('1','556');

已建立 1 行。

SQL> insert into custaddr values('2','551');

已建立 1 行。

SQL> insert into custaddr values('3','555');

已建立 1 行。

SQL> commit;

提交完成。

SQL> select * from custaddr;

ID                            AREA

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

1                              556

2                              551

3                              555

SQL> select * from custaddr partition(t_list556);

ID                            AREA

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

1                              556

SQL>

3刪除default分割槽

sql> alter table custaddr drop partition p_other;

表已更改。

sql>  select  table_name,partition_name  from  user_tab_partitions  where table_name='CUSTADDR';

table_name                                          partition_name

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

custaddr                                              t_list556

4新增新分割槽

SQL> alter table custaddr add partition t_list551 values('551') tablespace data01;

表已更改。

SQL>  select  table_name,partition_name  from  user_tab_partitions  where

table_name='CUSTADDR';

TABLE_NAME                                          PARTITION_NAME

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

CUSTADDR                                              T_LIST556

CUSTADDR                                              T_LIST551

5新增default 分割槽

SQL>  alter  table  custaddr  add  partition  p_other  values  (default)    tablespace data01;

表已更改。

SQL>  select  table_name,partition_name  from  user_tab_partitions  where

table_name='CUSTADDR';

TABLE_NAME                                          PARTITION_NAME

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

CUSTADDR                                              T_LIST556

CUSTADDR                                              T_LIST551

CUSTADDR                                              P_OTHER

6)對於區域性索引,oracle會自動增加一個區域性分割槽索引。驗證一下:

sql>  select  owner,index_name,table_name,partitioning_type  from dba_part_indexes

where index_name='ix_custaddr_id';

owner                   index_name                      table_name

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

icd                          ix_custaddr_id                  custaddr

sql> select index_owner,index_name,partition_name from dba_ind_partitions  where

index_name='ix_custaddr_id';

index_owner                index_name                                    partition_name

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

icd                                    ix_custaddr_id                                  p_other

icd                                    ix_custaddr_id                                  t_list551

icd                                    ix_custaddr_id                                  t_list556

分割槽索引自動建立了。

2 split 分割槽拆分

在上節中,我們說明了可以使用split的方式來新增分割槽。這裡我們用split方法繼續上面的實驗。

sql> alter  table  custaddr  split  partition  p_other values('552') into  (partition  t_list552

tablespace icd_service, partition p_other tablespace icd_service);     

表已更改。

--注意這裡紅色的地方如果是Range型別的使用atList使用Values

SQL>  select  table_name,partition_name  from  user_tab_partitions  where table_name='CUSTADDR';

TABLE_NAME                                          PARTITION_NAME

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

CUSTADDR                                              T_LIST556

CUSTADDR                                              T_LIST551

CUSTADDR                                      T_LIST552

CUSTADDR                                              P_OTHER

SQL>  select  index_owner,index_name,partition_name from dba_ind_partitions where index_name='IX_CUSTADDR_ID';

index_owner                   index_name                                  partition_name

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

icd                           ix_custaddr_id                                  p_other

icd                           ix_custaddr_id                                  t_list551

icd                           ix_custaddr_id                                  t_list552

icd                           ix_custaddr_id                                  t_list556

注意:分割槽表會自動維護區域性分割槽索引。全域性索引會失效,需要進行rebuild

3、合併分割槽Merge

       相鄰的分割槽可以merge為一個分割槽,新分割槽的下邊界為原來邊界值較低的分割槽,上邊界為原來邊界值較高的分割槽,原先的區域性索引相應也會合並,全域性索引會失效,需要rebuild

SQL> alter table custaddr merge partitions t_list552,p_other into partition p_other;

表已更改。

SQL>  select  index_owner,index_name,partition_name  from  dba_ind_partitions  

where index_name='IX_CUSTADDR_ID';

index_owner            index_name                  partition_name

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

icd                            ix_custaddr_id                    p_other

icd                            ix_custaddr_id                    t_list551

icd                            ix_custaddr_id                    t_list556

SQL>  select  table_name,partition_name  from  user_tab_partitions  where

table_name='CUSTADDR';

table_name                                          partition_name

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

custaddr                                              t_list556

custaddr                                              t_list551

custaddr                                              p_other

4、移動分割槽

SQL> alter table custaddr move partition P_OTHER tablespace system;

表已更改。

SQL> alter table custaddr move partition P_OTHER tablespace DATA01;

表已更改。

注意分割槽移動會自動維護區域性分割槽索引oracle 不會自動維護全域性索引所以需要我們重新rebuild 分割槽索引具體需要rebuild 哪些索引可以通過dba_part_indexes,dba_ind_partitions去判斷。

SQL>  Select index_name,status  From  user_indexes  Where table_name='CUSTADDR';

INDEX_NAME                       STATUS

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

IX_CUSTADDR_ID                  N/A

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

這裡有點小疑問:這個狀態是否是正常的,實驗中狀態如下:

SQL> select index_owner,index_name,partition_name,STATUS from dba_ind_partitions  where

2  index_name='IX_CUSTADDR_ID';

INDEX_OWNER                    INDEX_NAME                     PARTITION_NAME                 STATUS

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

SYS                            IX_CUSTADDR_ID                 P_OTHER                        UNUSABLE --可能是做了其他操作

SYS                            IX_CUSTADDR_ID                 T_LIST551                      USABLE   刪除分割槽重新新增之後

SYS                            IX_CUSTADDR_ID                 T_LIST556                      USABLE   狀態正常。

SQL> Select index_name,status  From  user_indexes  Where table_name='CUSTADDR';

INDEX_NAME                     STATUS

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

IX_CUSTADDR_ID                 N/A

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

5Truncate分割槽

SQL> select * from custaddr partition(T_LIST556);

ID                            AREA

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

1                 556

SQL> alter table custaddr truncate partition(T_LIST556);

表被截斷。

SQL> select * from custaddr partition(T_LIST556);

未選定行

說明:

Truncate相對delete操作很快,資料倉庫中的大量資料的批量資料載入可能會有用到;截斷分割槽同樣會自動維護區域性分割槽索引,同時會使全域性索引unusable,需要重建

6Drop分割槽

SQL> alter table custaddr drop partition T_LIST551;

表已更改。

SQL>  select  table_name,partition_name  from  user_tab_partitions  where

table_name='CUSTADDR';

TABLE_NAME                                          PARTITION_NAME

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

CUSTADDR                                               T_LIST556

CUSTADDR                                              P_OTHER  

同樣會自動維護區域性分割槽索引,同時會使全域性索引unusable,需要重建

(本系列文章為個人的學習筆記,參考了許多前輩的文章,如DAVE等。如果侵權之嫌,請和我聯絡,儘快刪除)