我正在尝试从数据库中删除一条记录。
代码非常简单:
SELECT * FROM database.tablename
WHERE SerialNbr = x
这给了我一个我正在寻找的记录。它具有SerialNbr以及作为其他表的外键的数字ID。我负责处理下一行代码开始运行的所有外键约束。
之后代码后跟:
DELETE FROM tablename
WHERE SerialNbr = x
我认为这应该是一个相对简单快速的查询。但它现在已经运行30分钟而没有结果。对外键或类似问题的任何问题都没有大喊大叫,只需花费很长时间来处理。我有什么办法可以加快这个过程吗?还是我只是在等待?删除一条记录似乎有点错误。
我正在使用Microsoft SQL Server 2008。
答案 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