首页 > 解决方案 > SQL-SERVER 为什么我的级联删除卡住了

问题描述

我有一个大约有 100 个表的数据库。Client几乎所有其他表(直接或间接)都引用了一个表。

我正在尝试Client通过执行此查询来删除一个的所有数据:

DELETE FROM Client 
WHERE Id = SomeNumber

此查询应CASCADE删除所有表中的所有行

直接或间接地与此Id有关Client

问题是查询卡住了,我不明白为什么。

这是查询计划

我通过这个脚本检查了锁

 select * from sysprocesses where blocked > 0

但没有结果。也没有收到任何错误。而且我的数据库中没有任何触发器。

我确实看到某个表中的几百行已被删除,但是

几秒钟后,查询卡住了。

标签: sqlsql-server

解决方案


您可以在计划中非常清楚地看到,一些依赖表在外键中没有索引。

当级联发生时,计划首先将所有行转储到内存表中。Table Spool您可以在计划的左上角看到这一点,以Clustered Delete.

然后它读回这些行,并将它们连接到依赖表。这些表必须有一个以外键为前导键的索引,否则您将获得全表扫描。

在您的大量表中发生了这种情况,在某些情况下,通过两次扫描和哈希连接进行双重级联。

创建索引时,不要只创建单列索引。与其他列和INCLUDE列创建合理的索引,只需确保外键是前导列。


我必须说,有这么多外键,你总是会遇到一些问题,因此你可能想要关闭CASCADE


推荐阅读