我们有一个表格,每月大约640万行增长,并且我们会定期(每月)删除一个分区。我们最近在这个表的主键上引入了一个连接表(带有级联删除)。这引入了引用完整性的问题,因为连接表引用了它内部的行,因此我们不能删除分区。
我们已收到建议,让我们的应用程序代码执行此操作,但我们认为这不是最佳解决方案。
我读完这篇文章后发现:https://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin002.htm#i1007479看来他们建议先DELETE FROM table partition (partitionID);
然后ALTER TABLE table DROP PARTITION partitionID;
我们担心:
我想知道某人是否有更好的主意。或者可以再次向我保证这不是一个坏主意。
答案 0 :(得分:1)
文档也说
DELETE FROM sales partition (dec98); ALTER TABLE sales DROP PARTITION dec98;
此方法最适合小型表,或者当删除的分区包含表中总数据的一小部分时,适用于大型表。
我认为在这种情况下,性能可能比通常的方式略好:
ALTER TABLE table DROP PARTITION partitionID UPDATE INDEXES;
或
ALTER TABLE table DROP PARTITION partitionID;
ALTER INDEX ... REBUILD;
当您跳过DELETE
时,您将无法获取任何撤消日志。
答案 1 :(得分:0)
Wernfried的答案非常有帮助,但我之后的是能够像主表一样对连接表进行分区。通过这种方式,我们可以删除连接表的分区,然后删除父分区。这样可以避免参考完整性问题,而无需删除。由于表的大小,删除不会是一个选项,我们的撤销/重做日志很可能不会产生压力。
这可以通过两种方式实现,第一种方法最简单,但可能不适用于较旧的数据库版本。我们可以在连接表上创建一个引用分区,这将使两个分区保持同步。
另一个选项是在子分区中包含与在父分区上分区相同的行。这有增加连接表大小的缺点,但它允许表分区保持同步。
Oracle在此处提供了更多信息:https://docs.oracle.com/database/121/VLDBG/GUID-54D18B18-6838-4115-9389-E1FB0D20A8CA.htm