删除一条记录超级慢的查询

时间:2014-01-30 20:34:22

标签: sql-server sql-delete

我正在尝试从数据库中删除一条记录。

代码非常简单:

    SELECT * FROM database.tablename
    WHERE SerialNbr = x

这给了我一个我正在寻找的记录。它具有Seri​​alNbr以及作为其他表的外键的数字ID。我负责处理下一行代码开始运行的所有外键约束。

之后代码后跟:

    DELETE FROM tablename
    WHERE SerialNbr = x

我认为这应该是一个相对简单快速的查询。但它现在已经运行30分钟而没有结果。对外键或类似问题的任何问题都没有大喊大叫,只需花费很长时间来处理。我有什么办法可以加快这个过程吗?还是我只是在等待?删除一条记录似乎有点错误。

我正在使用Microsoft SQL Server 2008。

2 个答案:

答案 0 :(得分:8)

删除该行并不需要很长时间,它正在排队等待访问该表。这称为阻塞,是数据库工作方式的基本部分。从本质上讲,如果其他人对其进行锁定,您就无法删除该行 - 他们可能正在阅读它并希望确保它在完成之前不会更改(或消失),或者他们可能正在尝试更新它(当然,如果你等不及,那么一个令人不满意的结局,因为一旦他们提交你的删除,无论如何都将删除它。)

检查运行查询的窗口的SPID。如果必须,请停止查询的当前实例,然后运行:

SELECT @@SPID;

记下该号码,然后尝试再次运行DELETE。当它坐在那里永远,在另一个查询窗口中检查阻止程序:

SELECT blocking_session_id FROM sys.dm_exec_requests WHERE session_id = <that spid>;

取出那里的数字,然后发出类似的内容:

DBCC INPUTBUFFER(<the blocking session id>);

这可以让您了解阻止程序正在做什么(您可以从sys.dm_exec_sessions获取其他信息等)。从那里你可以决定你想做什么 - 发出KILL <the spid>;,等一下,去问问他们在做什么等等。

您可能需要多次重复此过程,例如有时阻塞链可以是几个会话深度。

答案 1 :(得分:0)

我认为正在发生的是数据库中存在某种性能搜索,或者您可以通过简单地运行sp_who2并杀死SP来查看特定表。小心运行kill sp,因为它可能不是你的查询。

Delete From Database.Tablename
where SerialNbr=x
相关问题