在 SQL 服务器中使用"删除时级联"时出现性能问题



我有一个只有 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 上的聚集索引也可能有所帮助 - 但这可能会影响插入性能。

最新更新