2013-02-14 61 views
0

考慮一下這個表:清除Oracle數據庫記錄

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

所有子表有外鍵指向順序表的主鍵。並且有大量的數據。

現在,我必須清除一些訂單。雖然我刪除正確的順序,即子表的記錄,然後再順序表 - 這對本特定的查詢運行一個非常非常巨大的時間(15分鐘)(單個訂單ID):

DELETE FROM ORDER WHERE ID='whatever' 

的DBA說這可能是因爲Child Table依賴 - (FK檢查),而且子表本身包含大量記錄 -​​ 因此需要花費時間(即使所有依賴關係都將最終滿足 - 因爲子記錄已被顯式刪除)。

我有哪些選擇:

  1. 我可以執行刪除主順序表之前禁用子表FK的關係?我怎樣才能輕鬆做到這一點。
  2. 任何其他方式告訴Oracle不檢查依賴關係嗎?
    還是其他想法?

回答

1

這很可能是因爲您有unindexed foreign key

您已經先刪除了子項,但其他一些事務可能同時插入了數據,因此當您從父表中刪除時,Oracle必須再次檢查。

如果外鍵未與索引配對,則Oracle必須鎖定整個子表以確保沒有其他併發的未命中事務插入潛在的孤兒子。

即使在繁忙的小桌子上,此鎖定也需要很長時間才能獲取。

Adding indexes解決了這個問題。

+0

謝謝 - 這似乎是這種情況。 – Jasper 2013-02-15 07:48:15