截断/删除分区并保持全局索引可用
Oracle分区命令
-- Empty a partition / remove a partition (global indexes stay maintained):
ALTER TABLE customer_app.sale_part TRUNCATE PARTITION p2025 UPDATE INDEXES;
ALTER TABLE customer_app.sale_part DROP PARTITION p2025 UPDATE INDEXES;
-- 12c+ asynchronous global index maintenance: index is VALID but carries orphaned entries
SELECT index_name, status, orphaned_entries
FROM dba_indexes
WHERE owner = 'CUSTOMER_APP' AND table_name = 'SALE_PART';
-- Clean orphaned entries now (normally SYS.PMO_DEFERRED_GIDX_MAINT_JOB does it at night):
EXEC DBMS_PART.CLEANUP_GIDX(schema_name_in => 'CUSTOMER_APP', table_name_in => 'SALE_PART');
-- or a single index: ALTER INDEX customer_app.sale_part_id_gidx COALESCE CLEANUP;
-- Target the partition by value instead of name:
-- ALTER TABLE customer_app.sale_part DROP PARTITION FOR (DATE '2025-06-15') UPDATE INDEXES;作用
在分区级别立即删除旧数据,而不是逐行 DELETE。在 12c+ 中,UPDATE INDEXES 只在数据字典中标记全局索引(异步维护),而不是更新每个条目;索引立即保持可用,孤立条目稍后清理。
适用场景
按数据保留策略清除旧周期数据、ILM/清理作业中,以及避免在大表上执行 DELETE 带来的 undo/redo 负载时。
注意
需要 Partitioning 选件(EE 额外付费)。DROP/TRUNCATE 不可逆(flashback table 无法找回分区);请先备份或通过 exchange 归档。如果忘记 UPDATE INDEXES,全局索引会变为 UNUSABLE,查询可能遇到 ORA-01502。如果有子表引用(FK),操作会失败。在 interval 表上,最后一个 range(transition)分区无法删除。