有關Oracle表分割槽進行(DML)維護後對索引的影響的分析

regonly1發表於2008-05-10
今天對數字電視系統的大表的幾個分割槽進行了維護,總結以下經驗也是為了以後能夠更好的來維護分割槽表。
對索引的幾種情況分別進行總結:
1、如果刪除分割槽,則會導致該表下所有的索引狀態處於不可用狀態(除本地字首索引外);
2、如果重新命名錶,同上
3、如果truncate分割槽資料,同上;
4、重新命名分割槽,不會對索引產生任何影響。
解釋:
對於分割槽表,索引有以下幾種方式:
1、普通索引,與分割槽無關,就是平常的索引;
2、全域性分割槽索引,獨立於分割槽的索引,按照獨立的分割槽方式分割槽。按照網上介紹的和個人的實踐,這個方式查詢效率不高;
3、本地字首分割槽索引,即基於分割槽表的欄位進行的分割槽,建立方式很簡單,在普通索引建立的語句後面加個local即可,效率相對於普通索引高一點;
4、本地非字首分割槽索引,即非基於分割槽表的分割槽欄位,除非是特殊情況,這種方式效率較低,不推薦使用。

 

當索引處於不可用狀態時,資料將不能插入,會提示:ora-01502:state unusuable。
且這種情下,只要表中有一個索引處於不可用狀態,都會使表處於不可插入狀態。

可以修改引數來實現這種情況下的資料插入問題:alter session set skip_unusable_indexes=true;
但是有種情況除外,當有存在唯一主鍵索引時,資料依然不能插入。
而且主鍵索引也不能drop,因此想透過刪除主鍵索引再修改引數來實現資料的可插入是不可實現的。
因此這種情況下(索引狀態處於不可用狀態時)較好的辦法是,先刪除要進行本地索引分割槽的索引(此時尚未進行本地分割槽),
建立本地分割槽索引後,再drop表分割槽,這樣的好處是本來drop分割槽後需要重建n+1個索引,
現在只要重建n個索引,這樣的話就省去了重建這個索引的時間了。

對於本地分割槽字首索引,刪除分割槽只會對所在分割槽的部分產生影響,對於其他的部分則仍然是正常狀態的。

另:修改引數只能對於當前session所在的使用者有效,對於其他session,如果沒有設定該條件,資料還是處於不可插入狀態的。

以上情況,需要在實際的應用中充分考慮到這些問題才能最大的減少所帶來的資料丟失。


重新命名分割槽不會對索引狀態產生影響。

注:
1、如何刪除分割槽
alter table [table_name] drop partition [partition_name];

2、如何刪除與建立本地分割槽索引
刪除:drop index [index_name];
建立:create index [index_name] on [table_name]([index_column]) tablespace [tablespace_name] local [nologging/logging];
注意:
當在大表上建立索引時,使用NOLOGGING選項可以最小化重做記錄.使用NOLOGGING選項有以下優點.
節省重做日誌空間
降低索引建立實際
提高索引並行建立的效能.
但是nologging引數不建議在部署了dataguard的情況下使用,因為dataguard是基於歸檔日誌來進行遠端備份的。


3、如何重建索引:
alter index [index_name] rebuild [parallel {number}] [nologging/loggin];

4、如何建立分割槽:
--範圍分割槽
create table [table_name] partition by range([col_name])(
  partition [part_name] values less than [range_value] tablespace [tablespace_name],
  ...
)
--列表分割槽
--hash分割槽


5、如何截斷分割槽:
alter table [table_name] truncate partition
延伸:truncate一個表或一個分割槽,能使HWM重至為0,而delete則不能。

6、如何重新命名分割槽:
alter table [table_name] rename partition [old_name] to [new_name];


7、如何查詢索引狀態:
select ind.table_name, ind.index_name, ind.status
from user_indexes ind
where ind.index_name = '[index_name]'
and ind.table_name = '[table_name]'

8、如何新增分割槽:
alter table [table_name] add partition [partition_name] values less than([range_value]).

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

相關文章