Sql Oracle性能-禁用FKs以使DELETE语句更快地工作?

Sql Oracle性能-禁用FKs以使DELETE语句更快地工作?,sql,oracle,performance,sql-delete,Sql,Oracle,Performance,Sql Delete,当从Oracle中的一个大表(我们称之为表X)中删除时,禁用表X中没有ON DELETE级联的FKs有意义吗?我指的不是在链接到表X的其他表上禁用FKs,而是在表X上禁用FKs以提高DELETE语句的性能 我正在使表X上的索引不可用,但删除仍然需要一段时间 我认为这些FK对DELETE语句的性能并不重要,因为我们只是删除,而不是插入或更新,所以不需要检查FK。你觉得怎么样?这似乎是个非常糟糕的主意。无论您做什么,您都会有一段时间不在数据库上强制执行引用完整性。然后将FKs放回原位,哎呀,有人插入

当从Oracle中的一个大表(我们称之为表X)中删除时,禁用表X中没有ON DELETE级联的FKs有意义吗?我指的不是在链接到表X的其他表上禁用FKs,而是在表X上禁用FKs以提高DELETE语句的性能

我正在使表X上的索引不可用,但删除仍然需要一段时间


我认为这些FK对DELETE语句的性能并不重要,因为我们只是删除,而不是插入或更新,所以不需要检查FK。你觉得怎么样?

这似乎是个非常糟糕的主意。无论您做什么,您都会有一段时间不在数据库上强制执行引用完整性。然后将FKs放回原位,哎呀,有人插入了无效行

此外,
altertable
是一个DDL语句,因此执行它将提交到该点的所有工作。如果事务中的其他地方出现问题,您将失去回滚的能力


你能看一下解释计划看看为什么你的
DELETE
语句花了这么长时间吗?

这似乎是个非常糟糕的主意。无论您做什么,您都会有一段时间不在数据库上强制执行引用完整性。然后将FKs放回原位,哎呀,有人插入了无效行

此外,
altertable
是一个DDL语句,因此执行它将提交到该点的所有工作。如果事务中的其他地方出现问题,您将失去回滚的能力


你能看一下解释计划,看看为什么你的
DELETE
语句花了这么长时间吗?

最终我不必在归档过程开始前禁用这些FK,并在过程结束时启用它们。但是,为了提高DELETE语句的性能,我们必须在归档过程开始之前删除索引,并在归档过程结束后重新创建索引。我们也更频繁地提交文件。

最终,我不必在归档过程开始之前禁用这些FK,也不必在过程结束时启用它们。但是,为了提高DELETE语句的性能,我们必须在归档过程开始之前删除索引,并在归档过程结束后重新创建索引。我们也更频繁地提交。

外键(具有相应索引)的存在可能会导致delete使用错误的索引。您能否以使用正确索引的方式写入DELETE,比如使用提示或修改where子句?很可能是FKs指向/to/table X导致延迟,或者可能是表中的数据量。可能仅仅是外键(具有相应索引)的存在导致删除使用错误的索引。您能否以使用正确索引的方式编写删除,比如使用提示或修改where子句?很可能是FKs指向/to/table X导致任何延迟,或者可能是表中的数据量。我说的是一个数据库归档过程,将在所有用户被锁定时运行,因此,在禁用FK时,无需担心有人插入无效行。此外,当没有要提交的内容时,ALTER TABLE将在归档作业开始时发生。解释计划显示了索引的使用情况,一切看起来都很正常。我认为这里的主要问题是表的容量和索引的数量(我只能使其中一些无法使用),我认为kurosch提出了一个很好的观点:在执行删除操作时,仍然需要验证指向表的FKs,以确保没有删除子记录。也许这就是问题所在?我说的是一个数据库归档过程,它将在所有用户都被锁定的情况下运行,因此不用担心在禁用FKs时有人插入无效行。此外,当没有要提交的内容时,ALTER TABLE将在归档作业开始时发生。解释计划显示了索引的使用情况,一切看起来都很正常。我认为这里的主要问题是表的容量和索引的数量(我只能使其中一些无法使用),我认为kurosch提出了一个很好的观点:在执行删除操作时,仍然需要验证指向表的FKs,以确保没有删除子记录。也许这就是问题所在?