Oracle-11g-R2
截斷包含數據和全域索引的表分區
我必須截斷具有 20.000.000 條記錄的表的分區(392,000 條記錄)。
目前,我正在製作一個截斷表並重建索引。但是該表有 37 個索引,重建它們需要 20 分鐘。
看看Oracle Docs,它給了我三個選擇:
1-(這就是我正在做的)
ALTER TABLE sales TRUNCATE PARTITION dec98; ALTER INDEX sales_area_ix REBUILD;
2-
DELETE FROM sales PARTITION (dec98); ALTER TABLE sales TRUNCATE PARTITION dec98;
3-
ALTER TABLE sales TRUNCATE PARTITION dec98 UPDATE INDEXES;
所以我有兩個問題:
1-在我的情況下,這些選項中哪個更快?2-刪除然後截斷分區的含義(在選項2中)是什麼?
提前致謝!
表上的 37 個索引是全域索引嗎?
選項1:
截斷然後重建的位置 如果要截斷的分區至少佔表中總數據的 10%,則此方法最合適。但是重建這 37 個索引需要時間。
選項 2:
刪除和截斷分區的位置 這裡的刪除語句會更新所有全域索引、觸發觸發器並生成重做和撤消日誌。為了避免生成日誌並加快速度,在刪除之前,您可以將分區更改為
ALTER TABLE sales MODIFY PARTITION dec98 NOLOGGING;
然後繼續刪除和截斷。但是對於包含表中總數據的很大比例的分區,這仍然會比較慢
選項 3:
如果分區上有全域索引,UPDATE INDEXES 也將重建該索引。分區截斷時,本地索引會自動截斷。
我的建議是**使用選項 2 和 NOLOGGING;**如下,
ALTER TABLE sales MODIFY PARTITION dec98 NOLOGGING; DELETE FROM sales PARTITION (dec98); ALTER TABLE sales TRUNCATE PARTITION dec98 UPDATE INDEXES;