拥有包含数百万条记录的父表和具有指向父表的主键的三个子表的外键。像这样:从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或自己做。 –