从Oracle中的大表中删除时 - 让我们将其称为表X - 禁用表X没有ON DELETE CASCADE的FK是否有意义?我不是指在链接到表X的其他表上禁用FK,而只是禁用表X上的FK以提高DELETE语句的性能。
我使表X上的索引无法使用,但DELETE仍然需要一段时间。
我认为那些FK与DELETE语句的性能无关,因为我们只是删除,而不是插入或更新,因此不需要检查FK。你觉得怎么样?
答案 0 :(得分:1)
这似乎是一个非常糟糕的主意。无论您做什么,您都有一段时间不会对您的数据库强制执行参照完整性。然后你去把FK放回原位,哎呀,有人插入了无效的行。
此外,ALTER TABLE
是一个DDL语句,因此执行它将提交到那一点的任何工作。如果事务中的其他地方出现问题,您将无法回滚。
您是否可以查看解释计划,了解为什么DELETE
声明需要这么长时间?
答案 1 :(得分:0)
最终,我不必在存档过程开始之前禁用这些FK,并在进程结束时启用它们。但相反,为了提高DELETE语句的性能,我们不得不在归档过程开始之前删除索引,并在归档过程完成后重新创建它们。我们也经常承诺。