清除Oracle数据库记录

时间:2013-02-14 14:25:03

标签: sql oracle database-administration purge

考虑下表:

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不检查依赖关系的其他任何方式?
    还是其他任何想法?

2 个答案:

答案 0 :(得分:1)

这很可能是因为您有unindexed foreign key

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

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

即使在繁忙的小桌子上,这种锁也可能需要很长时间才能获得。

Adding indexes解决了这个问题。

答案 1 :(得分:0)

How to make index unusable and then rebuilt in index

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