合併分割槽(coalesce partition)

gaopengtttt發表於2013-03-22

合併分割槽(coalesce partition):合併分割槽是用來操作HASH分割槽表和hash全域性索引的。他會重新分配刪除的分割槽的資料到你現有的分割槽中。
限制:操作HASH分割槽表和hash全域性索引,如果對LIST/RANGE分割槽表進行合併報錯ORA-14259: 表未被雜湊方法分割槽
      全域性索引只有RANGE和HASH才有,並且RANGE不能使用合併,同時也不能對range分割槽進行新增分割槽報錯ORA-14640: 新增/合併索引分割槽操作只對雜湊分割槽的全域性索引有效,
      而且建立全域性RANGE分割槽必須帶有MAXVALUE屬性,並且是不行刪除的MAXVALUE分割槽,如果刪除報錯ORA-14078: 您不能刪除 GLOBAL 索引的最高分割槽。
我們這裡討論對索引的影響,包括全域性索引,本地索引和普通索引。
使用指令碼:

drop table t_pe_h;
CREATE TABLE t_pe_h (i NUMBER, j NUMBER , f number,k varchar2(20))
     PARTITION BY hash(j)
        (PARTITION p1 ,
         PARTITION p2,
         partition p4,
         partition p3);
create index t_pe_h_n on t_pe_h(i);
create index t_pe_h_l on t_pe_h(j) local;
create index t_pe_h_g on t_pe_h(f)
 GLOBAL PARTITION BY range(f)
        (PARTITION p1 VALUES  less than (10),
         PARTITION p2 VALUES less than (20),
         PARTITION p3 VALUES less than (maxvalue ));

insert into t_pe_h
values(2,5,5,'A');
insert into t_pe_h
values(1,15,10,'B');
insert into t_pe_h
values(3,25,40,'C');
insert into t_pe_h
values(2,65,30,'A');
insert into t_pe_h
values(1,75,20,'B');
insert into t_pe_h
values(3,85,50,'C');

 

select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_l';
select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_g';
select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_h_n';

然後檢視索引狀態
SQL> ALTER TABLE t_pe_h
  2       COALESCE PARTITION;
 
Table altered
 
SQL>
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_H_L                       USABLE   P4
T_PE_H_L                       UNUSABLE P2
T_PE_H_L                       USABLE   P1
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_H_G                       UNUSABLE P3
T_PE_H_G                       UNUSABLE P2
T_PE_H_G                       UNUSABLE P1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_h_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_H_N                       UNUSABLE
可以發現都失效了,明顯的合併分割槽自動把P2 ,P3合併為P2了,並且起本地索引相關的P2分割槽也失效了,因為底層的表的ROWID改變了。
普通索引和全域性索引均失效。
然後我們試試UPDATE INDEXES


SQL> ALTER TABLE t_pe_h
  2       COALESCE PARTITION update indexes;
 
Table altered
 
SQL>
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_l';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_H_L                       USABLE   P4
T_PE_H_L                       USABLE   P2
T_PE_H_L                       USABLE   P1
SQL> select INDEX_NAME ,STATUS,a.partition_name from dba_ind_partitions a where lower(index_name)='t_pe_h_g';
 
INDEX_NAME                     STATUS   PARTITION_NAME
------------------------------ -------- ------------------------------
T_PE_H_G                       USABLE   P3
T_PE_H_G                       USABLE   P2
T_PE_H_G                       USABLE   P1
SQL> select INDEX_NAME ,STATUS from dba_indexes where lower(index_name)='t_pe_h_n';
 
INDEX_NAME                     STATUS
------------------------------ --------
T_PE_H_N                       VALID
可以看到均有效,沒有問題。另外你還可以使用合併分割槽來合併全域性HASH的索引,如下:
ALTER INDEX hgidx COALESCE PARTITION;(對hash全域性分割槽索引有效)

 

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

相關文章