2011-04-12 55 views
0

我的SQL Server 2008 R2數據庫有很多的大,相關表:批量刪除 - 級聯刪除性能殺手?

  • 詳細-1
  • 詳細-2
  • 詳細-2-A

所有外鍵級聯:

  • master - > detail1
  • 主 - > detail2
  • detail2-> detail2-A

所以,當我從主刪除記錄,所有相關的細節如下。 刪除需要很長時間。例如。一位主人可以在detail2中擁有120萬條記錄,在detail2A中擁有6000萬條記錄。

創建一個首先刪除detail2A,然後是detail2等的存儲過程會更有效嗎?還是有更好的方法。

數據庫未分區。

回答

1

我們不允許在我們的系統上刪除級聯,因爲在完成大量刪除時您無法控制鎖定表。如果您有大量記錄需要經常刪除,有幾種選擇。首先,你真的需要刪除還是應該讓它們變爲非活動狀態?這可能是最有效的處理方式。

或者你可以分批處理。將所有要刪除的id值移到登臺表中,然後將其刪除1000(或20000或200,實際的號碼只能由系統根據性能決定),並一次循環直到所有記錄被刪除。您仍然可能想要一次刪除一張表中的記錄,而不是在級聯中刪除。

或者您可以標記要刪除的記錄,並在數據庫使用率較低的時段進行實際的刪除操作,以避免阻止其他用戶。

級聯刪除需要考慮的一件事是,如果存在子記錄,您是否真的想刪除該記錄?外鍵的存在,部分原因是阻止你這樣做,級聯刪除覆蓋該行爲。因此,如果您的孩子記錄與訂單類似,在任何情況下您都不希望在級聯刪除中自動刪除它們,否則即使客戶不再處於活動狀態,您也將失去所需的財務信息。