0

考虑这张表:

Table: ORDER [Columns: ID (PK), Order_Num, etc...]
Child Tables: ORDER_ITEMS, ORDER_TRANSACTIONS, ORDER_PAYMENTS, ORDER_TRANSPORT, and many more etc.

所有子表都有指向 ORDER 表主键的外键。而且数据量很大。

现在,我必须清除一些订单。虽然我删除了正确顺序中的记录,即先删除子表,然后再删除订单表——运行这个特定的查询需要非常非常长的时间(15 分钟)(对于单个订单 ID):

DELETE FROM ORDER WHERE ID='whatever'

DBA 说这可能是因为子表依赖项 - (FK 检查),并且子表本身包含大量记录 -​​ 因此需要时间(即使最终会满足所有依赖项 - 因为子记录被预先明确删除)。

我有什么选择:

  1. 我可以在主 ORDER 表上执行 DELETE 之前禁用子表中的 FK 关系吗?我怎样才能轻松做到这一点。
  2. 还有其他方法告诉 Oracle 不检查依赖项吗?
    还是有其他想法?
4

2 回答 2

1

这很可能是因为您有未索引的外键

您首先删除了子表,但同时其他一些事务可能已经插入了数据,因此当您从父表中删除时,Oracle 必须再次检查。

如果外键没有与索引配对,Oracle 必须锁定整个子表,以确保没有其他并发未提交事务插入潜在的孤儿。

获取此锁可能需要很长时间,即使在小型繁忙表上也是如此。

添加索引解决了这个问题。

于 2013-02-14T14:37:49.033 回答
0

如何使索引不可用然后在索引中重建

据我所知,此链接应该可以帮助您使索引无法使用,停止 oracle 以检查约束。所以它可能会帮助你。使您的索引不可用,删除记录,然后重建索引。

于 2013-02-14T14:33:07.443 回答