我有一个只有 10 行的父表,
但是它们各自的子表将有 100K 条记录,对于父表中的 1 个 ID,我们在子表中有 10K 条记录。
当我在父表上触发删除命令时,它也会从子表中删除记录,但是删除所有 5K 记录大约需要 10 分钟。
所以我的问题是,当我们对表产生级联效应时,从子表中删除记录的最佳实践是什么。
10K 记录只是某些 ID 的一个例子,我们有数百万条记录要删除。
假设 SQL Server 可以在删除时使用索引,则在子表中的外键列上放置索引可能会加快删除速度。 例如:
parent (id, col1, col2, ...)
child (id, parent_id, ...)
CREATE INDEX ON child (parent_id);
这样的索引可以让 SQL Server 在给定父记录的情况下快速查找每个子记录。
这太长了,无法发表评论。
删除表中的数千行需要时间。 删除操作必须:
- 找到要删除的行。
- 更改数据页上的数据。
- 记录更改。
- 修改索引。
- 执行触发器(如果有(。
- 删除其他表中的相关行(如果有(。
这可能非常昂贵。
鉴于父 id 的数量很少,我认为您可以通过按父 id 对子表进行分区来加快速度。 父 id 上的聚集索引也可能有所帮助 - 但这可能会影响插入性能。