考虑下表:
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检查),并且子表本身包含大量记录 - 因此所花费的时间(即使所有依赖关系最终都会得到满足 - 因为子记录已被明确删除)。
我有什么选择:
答案 0 :(得分:1)
这很可能是因为您有unindexed foreign key。
您已经先删除了孩子,但其他一些事务可能同时插入了数据,因此当您从父表中删除时,Oracle必须再次检查。
如果外键未与索引配对,则Oracle必须锁定整个子表,以确保没有其他并发的未提交的事务已插入可能的孤立子级。
即使在繁忙的小桌子上,这种锁也可能需要很长时间才能获得。
Adding indexes解决了这个问题。
答案 1 :(得分:0)
How to make index unusable and then rebuilt in index
据我所知,此链接可以帮助您使索引无法使用,停止oracle检查约束。所以它可能对你有帮助。使索引不可用,删除记录,然后重建索引。