最好经验是
场景1:
-
ALTER TABLE msg TRUNCATE PARTITION part2022_03;
-
ALTER INDEX msg_idx1 REBUILD;
适用于删除大量数据的情况下,msg_idx1是全局索引。
场景2:
-
DELETE FROM msg PARTITION (part_2022_03);
-
ALTER TABLE msg TRUNCATE PARTITION part2022_03;
适用于小表,或者被删除的分区只包含一小部分数据。
场景3:
-
ALTER TABLE msg TRUNCATE PARTITION part2022_03 UPDATE INDEXES;
全局索引也会被同时更新。
参考:
-
https://docs.oracle.com/en/database/oracle/oracle-database/21/vldbg/maintenance-partition-tables-indexes.html#GUID-BAFFE31C-07A2-4ED6-BDCF-8ECB79D7FE7D
12c上可以一次删除/截断多个分区
ALTER TABLE msg DROP PARTITIONS part_2017, part_2018, part_2019;
本地分区索引会同时删除/截断
如果只有一个分区,应该执行删除表
除非加上update indexes 或update global indexes,否则全局索引需要重建。
全局索引维护新机制
DROP
和TRUNCATE
默认执行异步全局索引维护;但是,UPDATE
INDEXES
为了向后兼容,该子句仍然是必需的。
全局索引维护与 DROP 和 TRUNCATE 分区维护操作分离,不会导致全局索引不可用。索引维护是异步完成的,可以延迟到以后的时间点。在不影响索引可用性的情况下将全局索引维护延迟到非高峰时间可以使 DROP 和TRUNCATE 分区和子分区维护操作在分区维护操作的时间点更快且资源密集度更低。
支持更新全局索引的分区维护操作 DROP PARTITION 和 TRUNCATE PARTITION 通过对索引的维护进行优化仅元数据。此功能支持维护元数据中的数据对象编号列表,其中与无效的删除和截断对象对应的索引条目将被忽略。
可以使用自动调度程序作业 SYS.PMO_DEFERRED_GIDX_MAINT_JOB 对索引执行维护操作,以清理所有全局索引。默认情况下,此作业计划在每天凌晨 2:00 运行。如果您想主动清理索引,您可以随时使用 DBMS_SCHEDULER.RUN_JOB 运行此作业。您还可以根据您的特定要求修改作业以使用不同的计划运行。但是,Oracle 建议您不要放弃该作业。
DBMS_PART 包为分区对象的维护和管理操作提供了一个接口。作为具有异步全局索引维护的先前分区维护操作的结果,全局索引可以包含指向不再存在的数据段的条目。这些陈旧的索引行在对表或索引的任何操作期间不会导致任何正确性
问题或损坏,无论这些是查询、DML、DDL 还是分析。
DBMS_PART.CLEANUP_GIDX 过程将识别和清理这些全局索引,以确保存储和性能方面的效率。
参考:
如何在 Oracle 12C 中删除/截断多个分区(文档 ID 1482264.1)
阅读(7065) | 评论(0) | 转发(0) |