Sql 无分区的大规模删除(需要2个联接)

Sql 无分区的大规模删除(需要2个联接),sql,oracle,performance,join,sql-delete,Sql,Oracle,Performance,Join,Sql Delete,我正在经历删除的无限循环。我尝试了很多方法来解决这个问题,但还是花了太多时间。我会尽量说清楚的 我在这个问题中有4个表 根据给定的池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_g

我正在经历删除的无限循环。我尝试了很多方法来解决这个问题,但还是花了太多时间。我会尽量说清楚的

我在这个问题中有4个表

根据给定的池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
  • 始终在线,因此无停机,也无CTA
  • 我们不能使用级联约束
  • 规范化非常重要
以下是我试过的:

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

这些人中没有一个工作时间比一小时还短。我们不能根据其中一个列值进行删除,这一事实没有帮助。有办法吗?

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

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

花一个小时有什么不对?这是你经常做的事吗?同意。如果您试图根据
表1
中的单个记录从
表4
中删除记录,我预计这需要一段时间(即使有适当的标记,也需要很长时间)。请注意,如果优化器可以使用不同的/附加的索引,则向
WHERE
子句添加附加条件可能会加快删除速度,例如,如果您已经知道所有行的创建日期都在某个任意值之前,或者文本以“a”开头,或者其他任何内容。在这里,你可能不需要承诺控制……桌子有多大?也就是说,6.3M是记录的大部分还是一小部分?限制条件是否仅基于表1?感谢大家的贡献!显然,要提高性能没有什么可做的,因为我需要第一个表中的Id。我发现最好的方法是每20k进行一次大容量收集和提交,这样如果它破坏了我的Oracle进程,我就可以重新启动该过程并恢复所有操作,而不是重做整个过程。如果我能使用partition:P就好了,再次感谢!花一个小时怎么了?这是你经常做的事吗?同意。如果您试图根据
表1
中的单个记录从
表4
中删除记录,我预计这需要一段时间(即使有适当的标记,也需要很长时间)。请注意,如果优化器可以使用不同的/附加的索引,则向
WHERE
子句添加附加条件可能会加快删除速度,例如,如果您已经知道所有行的创建日期都在某个任意值之前,或者文本以“a”开头,或者其他任何内容。在这里,你可能不需要承诺控制……桌子有多大?也就是说,6.3M是记录的大部分还是一小部分?限制条件是否仅基于表1?感谢大家的贡献!显然,要提高性能没有什么可做的,因为我需要第一个表中的Id。我发现最好的方法是每20k进行一次大容量收集和提交,这样如果它破坏了我的Oracle进程,我就可以重新启动该过程并恢复所有操作,而不是重做整个过程。如果我能使用partition:P就好了,再次感谢!是否尝试在删除操作之前禁用外键约束,并在删除操作之后再次启用它们。它有时会起作用……您是否尝试在删除操作之前禁用外键约束,并在删除操作之后再次启用它们。它有时起作用。。。