大规模删除(需要2个连接)而不进行分区

时间:2011-10-25 21:16:52

标签: sql oracle performance join sql-delete

我正在为删除操作遇到一些无限循环。我尝试了很多方法来处理这个问题,但仍然需要花费太多时间。我会尽量明确。

我在这个问题上有4个牵连表。

删除是根据给定的pool_id

完成的
Table 1 contain the pool_id
Table 2 the ticket_id foreign join ticket_pool_id with the pool_id
Table 3 ticket_child_id foreign join ticket_id with the ticket_id
Table 4 ticket_grand_child_id foreign ticket_child_id join with the ticket_child_id

Concerned count for each
table 1---->1
table 2---->1 200 000
table 3---->6 300 000
table 4---->6 300 000

所以实际上它要删除6.3M + 6.3M + 1.2M + 1行

这是约束:

  • 没有分区
  • Oracle版本9
  • 一直在线上网,因此没有CTAS
  • 的停机时间
  • 我们不能使用级联约束
  • 规范化非常重要

这是我试过的:

  • 批量删除
  • 删除语句(In and Exists子句)
  • 每个级别的临时表和1级联接
  • 程序并提交每个20k

没有一个人在不到一个小时的时间内工作。我们不能将删除基于其中一个列值的事实没有帮助。有办法吗?

1 个答案:

答案 0 :(得分:1)

如果您尝试删除加入表格,复杂性可能会变成立方体甚至更糟。对于包含许多记录的表格,这将成为性能杀手。您可以尝试从临时表中的第一个表输出要删除的值列表,然后使用另一个值从第二个表中选择要删除的ID,依此类推。我认为拥有适当的索引将使复杂性保持二次,并且将在正常的时间段内完成任务。祝你好运