编辑:已解决,桌面上有一个循环触发器(请在下面进一步阅读我自己的答案)。
我们有一个简单的删除语句,如下所示:
DELETE FROM tablename WHERE pk = 12345
这只是挂起,没有超时,没有任何东西。
我们已经查看了执行计划,它包含许多关于相关表的查找,以确保没有外键会删除删除,但我们已经验证其他表中没有任何行指向该特定行行。
目前没有其他用户连接到数据库。
我们对它运行DBCC CHECKDB,并报告0错误。
在查询挂起时查看 sp_who
和 sp_lock
的结果,我注意到我的spid有很多PAG和KEY锁,以及偶尔的TAB锁。
该表有1.777.621行,是的,pk是主键,因此它是基于索引的单行删除。执行计划中没有表扫描,但我注意到它包含的内容是 Table Spool(Eager Spool),但是表示估计的行数1.这实际上可以是表扫描吗伪装?它只是说它会查看主键列。
在表上尝试了DBCC DBREINDEX和UPDATE STATISTICS。两者都在合理的时间内完成。
遗憾的是,这个特定的表上有很多索引。它是我们系统中的核心表,包含大量列和引用,包括传出和传入。确切的数字是48个索引+主键聚集索引。
我们还应该注意什么?
另请注意,此表之前没有此问题,今天突然出现此问题。我们还有许多具有相同表设置的数据库(客户数据库的副本),它们的行为与预期一致,只是这个有问题。
答案 0 :(得分:4)
缺少的一条信息是您要从中删除数据的表上的索引数。由于SQL Server使用主键作为每个索引中的指针,因此对主索引的任何更改都需要更新每个索引。但是,除非我们说的很多,否则这不应成为问题。
我猜测,根据您的描述,这是数据库中的主表,由FK关系中的许多其他表引用。这会占用大量的锁,因为它会检查其余表的引用。并且,如果您启用了级联删除,则可能导致表中的删除需要检查多个表格。
答案 1 :(得分:3)
答案 2 :(得分:1)
好的,这很令人尴尬。
一位同事刚刚在该表中添加了一个触发器,触发器出现了错误。虽然他修复了这个错误,但从未为该表重新创建触发器。
所以服务器实际上什么也没做,只是做了很多次。
哦,好吧......
感谢所有阅读此内容并思考问题的人的眼球。
我将接受约瑟夫的回答,因为他是最接近的,并间接地引发了关于级联删除的问题。