DELETE语句在SQL Server上挂起,没有明显的原因
编辑:已解决,桌面上有一个带循环的触发器(请在下面进一步阅读我自己的答案).
我们有一个简单的删除语句,如下所示: DELETE FROM tablename WHERE pk = 12345 这只是挂起,没有超时,没有什么. 我们已经查看了执行计划,它包含许多关于相关表的查找,以确保没有外键会删除删除,但我们已经验证其他表中没有任何行引用该特定行. 目前没有其他用户连接到数据库. 我们对它运行DBCC CHECKDB,并报告0错误. 在查询挂起时查看sp_who和sp_lock的结果,我注意到我的spid有很多PAG和KEY锁,以及偶尔的TAB锁. 该表有1.777.621行,是的,pk是主键,因此它是基于索引的单行删除.执行计划中没有表扫描,但我注意到它包含了表Spool(Eager Spool)的内容,但表示估计的行数1.这实际上是伪装的表扫描吗?它只是说它看着主键列. 在表上尝试了DBCC DBREINDEX和UPDATE STATISTICS.两者都在合理的时间内完成 不幸的是,这个特定的表上有很多索引.它是我们系统中的核心表,包含大量列和引用,包括传出和传入.确切的数字是主键聚集索引的48个索引. 我们还应该注意什么? 另请注意,此表之前没有此问题,今天突然出现此问题.我们还有许多具有相同表设置的数据库(客户数据库的副本),并且它们的行为与预期一致,只是这个有问题. 解决方法缺少的一条信息是您要从中删除数据的表上的索引数.由于SQL Server使用主键作为每个索引中的指针,因此对主索引的任何更改都需要更新每个索引.但是,除非我们说的很多,否则这应该不是问题.我猜测,根据您的描述,这是数据库中的主表,由FK关系中的许多其他表引用.这将考虑大量的锁,因为它检查其余表的引用.并且,如果您启用了级联删除,则可能导致表中的删除需要检查多个表深度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |