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

Dyl*_*ton 1 sql-server sql-delete

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

代码很简单:

    SELECT * FROM database.tablename
    WHERE SerialNbr = x
Run Code Online (Sandbox Code Playgroud)

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

之后,代码后跟:

    DELETE FROM tablename
    WHERE SerialNbr = x
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Microsoft SQL Server 2008.

Aar*_*and 8

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

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

SELECT @@SPID;
Run Code Online (Sandbox Code Playgroud)

记下这个数字,然后尝试DELETE再次运行.当它坐在那里永远,在不同的查询窗口中检查阻止程序:

SELECT blocking_session_id FROM sys.dm_exec_requests WHERE session_id = <that spid>;
Run Code Online (Sandbox Code Playgroud)

拿那里的数字,并发出类似的东西:

DBCC INPUTBUFFER(<the blocking session id>);
Run Code Online (Sandbox Code Playgroud)

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

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