分割槽表學習筆記(二)--分割槽管理
主要內容:
1、新增新的分割槽
2、split 分割槽拆分
3、合併分割槽Merge
4、移動分割槽
5、Truncate分割槽
6、drop 分割槽
----------------------------------------------------------
1、新增新的分割槽
新增新的分割槽有2中情況:
(1)原分割槽裡邊界是maxvalue或者default。這種情況下,我們需要把邊界分割槽drop掉,加上新分割槽後,在新增上新的分割槽。或者採用split,對邊界分割槽進行拆分。
(2)沒有邊界分割槽的。這種情況下,直接新增分割槽就可以了。
以邊界分割槽新增新分割槽示例:
(
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型別的,使用at,List使用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
------------------------------------------------------------------- -----------------------
5、Truncate分割槽
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,需要重建
6、Drop分割槽
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等。如果侵權之嫌,請和我聯絡,儘快刪除)