Sql server 删除一条记录的查询速度非常慢

Sql server 删除一条记录的查询速度非常慢,sql-server,sql-delete,Sql Server,Sql Delete,我正试图从数据库中删除一条记录 代码非常简单: SELECT * FROM database.tablename WHERE SerialNbr = x 这是我要找的一张唱片。它有SerialNbr和一个数字ID,这些ID是其他表的外键。我处理了下一行代码将从何处开始运行的所有外键约束 之后,代码后面跟着: DELETE FROM tablename WHERE SerialNbr = x 我认为这应该是一个相对简单和快速的查询。然而,它现在已经运行了30分钟

我正试图从数据库中删除一条记录

代码非常简单:

    SELECT * FROM database.tablename
    WHERE SerialNbr = x
这是我要找的一张唱片。它有SerialNbr和一个数字ID,这些ID是其他表的外键。我处理了下一行代码将从何处开始运行的所有外键约束

之后,代码后面跟着:

    DELETE FROM tablename
    WHERE SerialNbr = x
我认为这应该是一个相对简单和快速的查询。然而,它现在已经运行了30分钟,没有结果。它并没有大声抱怨外键有任何问题或类似的问题,只是需要很长时间来处理。我能做些什么来加快这个过程吗?还是我只是在等待?似乎有点不对劲,删除一条记录需要这么长时间


我正在使用Microsoft SQL Server 2008。

删除该行不会花费很长时间,它正在排队等待轮到它访问该表。这称为阻塞,是数据库工作方式的基本部分。基本上,如果其他人锁定了该行,则无法删除该行-他们可能正在读取该行,并希望在完成之前确保该行不会更改(或消失),或者他们可能正在尝试更新该行(当然,如果您等待该行退出,则会导致不满意的结果,因为一旦他们提交,您的删除操作仍将删除该行)

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

SELECT @@SPID;
记下该数字,然后再次尝试运行
DELETE
。当它永远停留在那里时,在另一个查询窗口中检查拦截器:

SELECT blocking_session_id FROM sys.dm_exec_requests WHERE session_id = <that spid>;
从sys.dm_exec_请求中选择blocking_session_id,其中session_id=;
把电话号码记在那里,然后发出如下命令:

DBCC INPUTBUFFER(<the blocking session id>);
DBCC INPUTBUFFER();
这应该会让您了解拦截器正在做什么(您可以从
sys.dm_exec_sessions
等获取其他信息)。从那里你可以决定你想做什么-发布
KILL,等等,去问那个人他们在做什么,等等


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

删除该行并不需要很长时间,它正在排队等待轮到它访问该表。这称为阻塞,是数据库工作方式的基本部分。基本上,如果其他人锁定了该行,则无法删除该行-他们可能正在读取该行,并希望在完成之前确保该行不会更改(或消失),或者他们可能正在尝试更新该行(当然,如果您等待该行退出,则会导致不满意的结果,因为一旦他们提交,您的删除操作仍将删除该行)

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

SELECT @@SPID;
记下该数字,然后再次尝试运行
DELETE
。当它永远停留在那里时,在另一个查询窗口中检查拦截器:

SELECT blocking_session_id FROM sys.dm_exec_requests WHERE session_id = <that spid>;
从sys.dm_exec_请求中选择blocking_session_id,其中session_id=;
把电话号码记在那里,然后发出如下命令:

DBCC INPUTBUFFER(<the blocking session id>);
DBCC INPUTBUFFER();
这应该会让您了解拦截器正在做什么(您可以从
sys.dm_exec_sessions
等获取其他信息)。从那里你可以决定你想做什么-发布
KILL,等等,去问那个人他们在做什么,等等


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

我认为正在发生的是数据库或特定表中存在某种性能搜索,您只需运行
sp_who2
并杀死sp即可看到。运行kill sp时要小心,因为它可能不是您的查询

Delete From Database.Tablename
where SerialNbr=x

我认为正在发生的是,在数据库或特定表中存在某种性能搜索,您只需运行
sp_who2
并杀死sp即可看到。运行kill sp时要小心,因为它可能不是您的查询

Delete From Database.Tablename
where SerialNbr=x

但它最终会删除该行吗?
SerialNbr
是否总是唯一的?听起来你只需要在那一列上建立一个合适的索引,它还在运行。我不知道它是否最终会删除该行。SerialNbr始终是唯一的。请取消查询并重试。删除操作不应比选择操作慢。是否有触发器?该列是索引的一部分吗?(一个聚集的,一个非聚集的?),表有多大?@DylanJamesCreighton:您描述的20k行数据,无论有没有索引,本身都不会导致延迟。我认为您正在经历Aaron在其回答中描述的阻塞。但它最终会删除该行吗?
SerialNbr
是否总是唯一的?听起来你只需要在那一列上建立一个合适的索引,它还在运行。我不知道它是否最终会删除该行。SerialNbr始终是唯一的。请取消查询并重试。删除操作不应比选择操作慢。是否有触发器?该列是索引的一部分吗?(一个聚集的,一个非聚集的?),表有多大?@DylanJamesCreighton:您描述的20k行数据,无论有没有索引,本身都不会导致延迟。我想你正在经历亚伦在回答中描述的障碍。好的。我正在试这个。首先需要我的DBA提供更多权限,但感谢您让我走上正轨!更新:获得了所需的权限并找到了块。删除了块,很快就删除了记录。谢谢你的帮助!好吧我正在试这个。首先需要我的DBA提供更多权限,但感谢您让我走上正轨!更新:获得了所需的权限并找到了块。清除了块并将其删除