Oracle 11g - 级联删除分区

时间:2016-10-27 03:56:28

标签: sql oracle oracle11g database-partitioning

我们有一个表格,每月大约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;

我们担心:

  1. 处理负荷
  2. 对撤消/重做日志的影响
  3. 我想知道某人是否有更好的主意。或者可以再次向我保证这不是一个坏主意。

2 个答案:

答案 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