【问题标题】:Deleting many records with child tables删除许多带有子表的记录
【发布时间】:2009-01-30 14:12:15
【问题描述】:

情况:

  • 表 TBL 有大约 10k 项要删除,
  • 表 TBL 有 14 个子表,删除规则为“无操作”,
  • 我想删除子表中的 10k 个条目和引用的条目。

程序:

  • 删除子表中的记录,
  • 禁用约束(如果未禁用约束,则在下一步中删除需要永远),
  • 删除TBL表中的记录,
  • 启用约束。

有没有更优雅的方法来做到这一点?

问题是第三步耗时太长,因为它正在检查 14 个大表是否存在不存在的记录。我的程序有很好的执行时间,但我认为有更优雅的方式。

【问题讨论】:

  • 需要在子表中索引FK列。你正在做 14 个 FTS。那=慢。 14 次索引查找 = 快速。

标签: oracle parent-child


【解决方案1】:

听起来您需要在子表上索引外键。每次删除子表上没有索引的父记录时,它必须对子表进行全表扫描以检查外键约束是否被破坏。

对于索引,最坏的情况是索引范围扫描。

编辑: 可以在此处找到更多信息以及确定这是否是您的问题的脚本。 http://asktom.oracle.com/tkyte/unindex/index.html

【讨论】:

  • 这是一个很好的提示和 AskTom 链接(我投了赞成票),但是子表在这个 FK 上被索引。
  • 我对您的方法的主要担忧是,如果另一个会话在约束关闭时将错误数据插入到子表中。如果那是不可能的,那么你应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多