sql - DELETE语句无明显原因卡在SQL Server上

标签 sql sql-server sql-server-2005

编辑:解决了, table 上有一个带圈的触发器(在下面进一步阅读我自己的答案)。

我们有一个简单的delete语句,如下所示:

DELETE FROM tablename WHERE pk = 12345

这只是挂起,没有超时,什么都没有。

我们已经研究了执行计划,该计划由对相关表的许多查找组成,以确保没有外键会触发删除操作,但是我们已验证其他表中没有任何行引用该特定行。

目前没有其他用户连接到数据库。

我们已经对其运行DBCC CHECKDB,它报告0错误。

在查询挂起时查看sp_whosp_lock的结果,我注意到我的spid有很多PAG和KEY锁,以及偶尔的TAB锁。

该表具有1.777.621行,是的,pk是主键,因此它是基于索引的单行删除。在执行计划中没有表扫描,尽管我注意到其中包含表假脱机(急切假脱机)的内容,但表示估计的行数1。这实际上可能是变相的表扫描吗?它只说它查看主键列。

在表上尝试过DBCC DBREINDEX和UPDATE STATISTICS。两者均在合理时间内完成。

不幸的是,此特定表上有大量索引。它是我们系统中的核心表,具有大量的列和引用,包括传出的和传入的。确切的数目是48个索引+主键聚集索引。

我们还要看什么?

还请注意,此表以前没有此问题,今天这个问题突然发生了。我们也有许多具有相同表设置的数据库(客户数据库的副本),并且它们的行为符合预期,这只是问题所在。

最佳答案

缺少的一条信息是您要从中删除数据的表上的索引数。由于SQL Server使用主键作为每个索引中的指针,因此对主索引的任何更改都需要更新每个索引。不过,除非我们谈论的数字很高,否则这不是问题。

根据您的描述,我猜测这是数据库中的主表,被FK关系中的许多其他表引用。这将解决大量锁问题,因为它会检查表的其余部分以供引用。而且,如果您启用了级联删除功能,则可能导致表中的删除操作需要对多个表进行深入检查。

关于sql - DELETE语句无明显原因卡在SQL Server上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56070/

相关文章:

C# SQL Server Coonnectivity - 持续连接(客户端 - 服务器

sql - 对于两个日期之间的每一天,添加一行包含相同的信息,但仅在开始/结束列中添加当天

asp.net - 使用 HttpHandler 流式传输数据库图像

mysql - 将筛选报告中的多行/记录插入到另一个表中

c# - SQL 输出存储过程不适用于 ExecuteReader

mysql - 如何找到使用 Mysql 函数的位置?

sql - 子查询返回多个值如何处理

sql - 简单的SQL问题(MySQL)

sql - 我们可以在使用 DBCC CHECKIDENT 重新启动标识列计数后回滚到原始状态吗?

sql-server-2005 - SQL Server 2005 复制和订阅服务器上的不同索引