Oracle-11g-R2

截斷包含數據和全域索引的表分區

  • August 13, 2021

我必須截斷具有 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;

引用自:https://dba.stackexchange.com/questions/62359