删除许多带有子表的记录
Posted
技术标签:
【中文标题】删除许多带有子表的记录【英文标题】:Deleting many records with child tables 【发布时间】:2009-01-30 14:12:15 【问题描述】:情况:
表 TBL 有大约 10k 项要删除, 表 TBL 有 14 个子表,删除规则为“无操作”, 我想删除子表中的 10k 个条目和引用的条目。程序:
删除子表中的记录, 禁用约束(如果未禁用约束,则在下一步中删除需要永远), 删除TBL表中的记录, 启用约束。有没有更优雅的方法来做到这一点?
问题是第三步耗时太长,因为它正在检查 14 个大表是否存在不存在的记录。我的程序有很好的执行时间,但我认为有更优雅的方式。
【问题讨论】:
需要在子表中索引FK列。你正在做 14 个 FTS。那=慢。 14 次索引查找 = 快速。 【参考方案1】:听起来您需要在子表上索引外键。每次删除子表上没有索引的父记录时,它必须对子表进行全表扫描以检查外键约束是否被破坏。
对于索引,最坏的情况是索引范围扫描。
编辑: 可以在此处找到更多信息以及确定这是否是您的问题的脚本。 http://asktom.oracle.com/tkyte/unindex/index.html
【讨论】:
这是一个很好的提示和 AskTom 链接(我投了赞成票),但是子表在这个 FK 上被索引。 我对您的方法的主要担忧是,如果另一个会话在约束关闭时将错误数据插入到子表中。如果那是不可能的,那么你应该没问题。以上是关于删除许多带有子表的记录的主要内容,如果未能解决你的问题,请参考以下文章