oracle删除分区空间,Oracle 11g维护分区(三)——Dropping Partitions
刪除分區
你可以從范圍、間隔、列表或者復合[范圍|列表]分區表中刪除分區。對于間隔分區表而言,你只能刪除范圍分區或者那些已經物化的間隔分區。對于哈希分區表或者復合哈希分區表的哈希子分區而言,你必須使用融合操作來代替。
你不能從引用分區表中刪除一個分區。相反,對父表的刪除操作會級連到所有子表。
刪除表分區
使用一下語句來刪除一個表分區或者子分區:
ALTER TABLE ... DROP PARTITION,用來刪除一個表分區
ALTER TABLE ... DROP SUBPARTITION,用來刪除一個復合[范圍|列表]分區表的一個子分區
為了保存分區里的數據,可以使用合并分區語句來代替刪除分區語句。
如果該表定義有本地索引,那么上述語句將會從本地索引中刪除對應的分區或子分區。所有的全局索引,或者全局分區索引的所有分區都將被標識為UNUSABLE,除非符合下面兩個條件之一:
你指定了UPDATE INDEXES子句(不能用來指定索引組織表,可以使用UPDATE GLOBAL INDEXES來代替)
刪除的分區或者子分區為空
注意:
如果一個表只包含一個分區,你不能刪除該分區。相反,你必須刪除這個表。
在間隔分區表或者間隔復合分區表的范圍分區部分,你不能刪除最高的范圍分區。
下面的部分包含了刪除表分區的一些場景。
從一個包含數據和全局索引的表中刪除一個分區
如果分區包含數據并且表上定義有一個或多個全局索引,那么可以使用下面任一方法來刪除表分區。
方法一
在ALTER TABLE ... DROP PARTITION語句執行期間,保持全局索引不變。然后,你必須重建全部全局索引(無論是否分區),因為這個索引(或者索引分區)已經被標識為UNUSABLE。下面的語句提供了一個示例,首先從sales表刪除分區dec98,然后重建該表的全局索引。
ALTER TABLE sales DROP PARTITION dec98;
ALTER INDEX sales_area_ix REBUILD;
如果索引sales_area_ix是一個范圍分區全局索引,那么索引的全部分區都需要重建。并且,我們不可能在一條語句中重建索引的所有分區。你必須針對索引的每一個分區分別執行REBUILD語句。下面的語句分別重建了索引分區jan99_ix, feb99_ix, mar99_ix, ..., dec99_ix。
ALTER INDEX sales_area_ix REBUILD PARTITION jan99_ix;
ALTER INDEX sales_area_ix REBUILD PARTITION feb99_ix;
ALTER INDEX sales_area_ix REBUILD PARTITION mar99_ix;
...
ALTER INDEX sales_area_ix REBUILD PARTITION dec99_ix;
該方法最適用于被刪除分區包含總數據很大比例的大表。
方法二
在執行ALTER TABLE ... DROP PARTITION之前,執行DELETE語句來刪除分區的所有數據行。DELETE語句更新全局索引。
例如,要刪除第一個分區,執行以下語句:
DELETE FROM sales partition (dec98);
ALTER TABLE sales DROP PARTITION dec98;
該方法最適用于小表,或者被刪除分區數據占總數據很小比例的大表。
方法三
在執行ALTER TABLE... DROP PARTITION語句時指定UPDATE INDEXES語句。這樣做的話,在刪除分區的同時也會更新全局索引。
ALTER TABLE sales DROP PARTITION dec98
UPDATE INDEXES;
從一個包含數據和引用完整性約束的表中刪除一個分區
如果該表包含引用完整性約束,并且一個分區包含數據,選擇下面一種方法來刪除該分區。該表只有一個本地索引,因此不需要重建任何索引。
方法一
如果表中不含引用被刪除分區中數據的數據,那么你可以禁用引用表的完整性約束,執行ALTER TABLE ... DROP PARTITION語句,然后在重新啟用完整性約束。
該方法最適用于被刪除分區包含總數據很大比例的大表。如果表中含有引用被刪除分區中數據的數據,那么必須確保刪除這些數據,這樣你就可以重新啟用引用完整性約束。
方法二
如果引用表中有數據,那么在你執行ALTER TABLE ... DROP PARTITION語句之前,你可以執行DELETE語句來刪除分區的所有數據。DELETE語句會強制引用完整性約束,也會激發觸發器并生成redo和undo日志。如果你創建約束時包含ON DELETE CASCADE選項,那么刪除操作也會成功刪除引用表的所有行。
DELETE FROM sales partition (dec94);
ALTER TABLE sales DROP PARTITION dec94;
該方法最適用于小表,或者被刪除分區數據占總數據很小比例的大表。
刪除間隔分區
你可以刪除一個間隔分區表中的間隔分區。該操作只會刪除分區的數據,分區的定義會被保留。如果有數據插入到剛剛被刪除的分區,那么數據庫將會再次創建一個間隔分區。
你也可以刪除一個間隔分區表中的范圍分區。在一個間隔分區表中刪除一個范圍分區,要遵守在一個范圍分區表中刪除一個范圍分區的規則。如果你要刪除范圍分區靠中間的分區,那么下一分區的下邊界將會移動到你剛剛刪除的那個分區的下邊界。你不能刪除一個間隔分區表中范圍分區部分的最高范圍分區。
下面的例子刪除了sales表的2007年九月的間隔分區。由于該標只有本地索引,沒有索引失效。
ALTER TABLE sales DROP PARTITION FOR(TO_DATE('01-SEP-2007','dd-MON-yyyy'));
刪除索引分區
你不能顯式地刪除一個本地索引的一個分區。相反,只有你刪除基表的一個分區時相應的本地索引分區會被刪除。
如果一個全局分區索引為空,那么你可以通過執行ALTER INDEX ... DROP PARTITION語句顯式地刪除索引分區。但是,如果一個全局索引分區不為空,那么刪除這個分區將會導致下一個最高分區被標識為UNUSABLE。例如,你要刪除索引分區P1,P2時下一個最高分區。你必須執行以下語句:
ALTER INDEX npr DROP PARTITION P1;
ALTER INDEX npr REBUILD PARTITION P2;
注意:
在一個全局索引中,你不能刪除最高分區。
:
總結
以上是生活随笔為你收集整理的oracle删除分区空间,Oracle 11g维护分区(三)——Dropping Partitions的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle密码文件认证,Oracle
- 下一篇: matlab 颜色势能,Matlab在模