擁有包含數百萬條記錄的父表和具有指向父表的主鍵的三個子表的外鍵。像這樣:從SQL Server中的多個表中刪除多條記錄的最佳做法
Parent
parent_id (PK) \ Child1
| child1_id (PK)
|---- parent_id (FK)
|
| Child2
| child2_id (PK)
|---- parent_id (FK)
|
| Child3
| child3_id (PK)
|---- parent_id (FK)
什麼是硬的最佳實踐從Parent
刪除的記錄幾十萬?我想刪除以下條件:DELETE FROM PARENT WHERE [STATUS] = 'DONE'
。有沒有辦法在刪除發生時鎖定表格?那麼其他記錄可以插入所有這些表中? 我可以想到的選項:
- 使用
CASCADE DELETE
上的外鍵。 - 使用軟刪除:開始一個事務,
UPDATE parent SET [DELETED] = 1 WHERE [STATUS] = 'DONE'
,刪除每個孩子與父母的ID,然後硬刪除父母並提交。 - 類似於2,但使用過程並將這些ID保存在表變量中,以便我不需要在
Parent
表中添加新的[DELETED]
列。 - 選擇要刪除的ID
SELECT parent_id FROM parent WHERE [STATUS] = 'DONE'
然後做一個批量刪除傳遞所有這些ID。 (這真的很糟糕,所以我放棄了它)。
我正在使用SQL Server 2014和spring jdbc。
我建議在外鍵上使用級聯刪除,每次刪除多達50,000條記錄的批處理。刪除大量記錄通常會在將其分解爲小批量時加速。 –
我是測量操作進度的粉絲,所以我會考慮編寫一個程序來刪除小部分的記錄。或者使用ON CASCADE DELETE或自己做。 –