如何立即终止/停止长 SQL 查询?

Posted

技术标签:

【中文标题】如何立即终止/停止长 SQL 查询?【英文标题】:How to kill/stop a long SQL query immediately? 【发布时间】:2013-04-10 09:03:39 【问题描述】:

我正在使用 SQL Server 2008 及其管理工作室。我执行了一个产生许多行的查询。我试图通过红色的取消按钮取消它,但它在过去 10 分钟内没有停止。它通常会在 3 分钟内停止。

可能是什么原因,我该如何立即阻止它?

【问题讨论】:

您是否检查过是否有任何应用程序持有此查询?? 停止并再次重新启动您的 sql 服务.. 我遇到过这种情况,因为即使我在 sql 中运行所有内容,我也希望编辑我的配置文件... @user1102001 - 不强迫你做任何事情。我说可以和不应该:) 【参考方案1】:
sp_who2 'active'

检查 CPUTimeDiskIO 下的值。注意值比较大的进程的SPID。

kill SPID value

【讨论】:

我正在使用 Microsoft SQL Server 2008 R2,我试图找出正在执行和暂停的查询的 SPID 是什么,发现有许多相同的 SELECT SQL 实例具有相同的 SPID。当我尝试执行命令 KILL 114 - 这里 114 是我暂停查询的 SPID 值。我收到以下错误:请指导。消息 102,级别 15,状态 1,第 2 行 '114' 附近的语法不正确。【参考方案2】:

可能是什么原因

只要您的attention 可以到达服务器并得到处理,查询就会立即取消。查询必须处于可取消状态,这几乎总是正确的,除非您执行某些操作,例如从 SQLCLR 调用 Web 服务。如果您的注意力无法到达服务器,通常是由于scheduler 过载。

但是,如果您的查询是必须回滚的事务的一部分,则回滚不能被中断。如果需要 10 分钟,则需要 10 分钟,而您对此无能为力。即使重新启动服务器也无济于事,只会使启动时间更长,因为恢复必须完成回滚。

要回答哪个具体原因适用于您的案例,您需要自行调查。

【讨论】:

请注意,SSMS 仅在收到注意回复后才将查询显示为“已取消”(而不是“尝试取消”),这意味着首先排空通信管道中的所有中间结果(例如. 所有结果都在 TCP/IP 发送/接收缓冲区和所有内存缓冲区中)。 我希望它会说“回滚” @RemusRusanu - 如果估计的回滚时间是 20,000 多个小时怎么办?很高兴从备份中恢复。 dba.stackexchange.com/questions/222145/…【参考方案3】:

首先执行以下命令:

sp_who2

然后使用 SPID 执行以下命令,您从上面的命令中获得:

KILL SPID value

【讨论】:

【参考方案4】:

这是一个愚蠢的答案,但至少在我的情况下它可以可靠地工作: 在管理工作室中,当“取消执行查询”没有停止查询时,我只需单击以关闭当前的 sql 文档。它问我是否要取消查询,我说是,然后你瞧,几秒钟后它就停止执行了。之后它会询问我是否要在关闭之前保存文档。此时我可以单击取消以保持文档打开并继续工作。不知道幕后发生了什么,但它似乎有效。

【讨论】:

在这种情况下,查询实际上可能仍在后台运行/挂起,您将不再看到它。 我认为它会终止连接,因为您必须在此之后重新连接。 它会终止与 SSMS 的连接,但不会(必然)终止与数据库的连接。 我确实试过这个我的 sql 挂了。 T_T 如果你看不到它,它就不存在。【参考方案5】:

如果您取消并看到该运行

 sp_who2 'active'

(活动监视器在旧的 sql server 2000 FYI 上不可用)

找出你想杀死的 SPID,例如81

Kill 81

再次运行sp_who2 'active',您可能会注意到它正在休眠...正在回滚

要让 STATUS 再次运行 KILL

Kill 81 

然后你会收到这样的消息

 SPID 81: transaction rollback in progress. Estimated rollback completion: 63%. Estimated time remaining: 992 seconds.

【讨论】:

我必须运行 KILL spid WITH STATUSONLY 才能看到状态消息。【参考方案6】:

    首先,您需要使用以下查询显示/检查所有正在运行的查询-

    SELECT text, GETDATE(), *
    FROM sys.dm_exec_requests
    CROSS APPLY sys.dm_exec_sql_text(sql_handle)
    

    为所有正在运行的查询分别找到 Session-IdDescription,然后复制您要立即终止/停止的特定查询的 Session-Id。

    使用此查询使用 Session-Id 终止/停止特定查询:

    Kill Session-id
    

    例子:

    kill 125 --125 is my Session-Id
    

【讨论】:

请通过编辑为您的答案添加一些解释,以便其他人可以从中学习【参考方案7】:

您可以使用键盘快捷键 ALT + Break 来停止查询执行。但是,这可能不会在所有情况下都成功。

【讨论】:

这个是在管理工作室为我工作的。谢谢【参考方案8】:

我很长一段时间以来一直在遭受同样的事情。当您连接到远程服务器(可能很慢)或网络连接不佳时,尤其会发生这种情况。 我怀疑微软是否知道正确答案是什么。

但是因为我试图找到解决方案。只有一种外行方法有效

单击您遇到的查询选项卡上的关闭按钮。 过了一会儿(如果微软对你不苛刻!!!)你可能会看到一个窗口询问这个

“查询当前正在执行。您要取消查询吗?”

点击“是”

过一会它会询问你是否要保存这个查询?

点击“取消”

然后发布,可能是您的工作室再次稳定执行您的查询。

它在后台的作用是断开您的查询窗口与连接。因此,为了再次运行查询,再次连接远程服务器需要一些时间。但相信我,这种权衡比看到那个永远运行的计时器的痛苦要好得多。

PS:这对我有用,如果对你也有用的话,谢谢。 !!!

【讨论】:

仍然为我工作并解决了我的问题 -->【参考方案9】:

显然在 sql server 2008 r2 64bit 上,从 IIS 长时间运行查询,kill spid 似乎不起作用,查询只是一次又一次地重新启动。它似乎在重用 spid。该查询导致 sql server 不断占用 35% 的 cpu 并挂起网站。我猜 bc/ 它无法响应其他登录查询

【讨论】:

我很想看到这个来源。【参考方案10】:

如果红色的“停止”框不起作用,一个简单的答案是尝试按键盘上的“Ctrl + Break”按钮。

如果您在 Linux 上运行 SQL Server,则可以将一个名为“killall”的应用添加到系统托盘中 只需单击“killall”按钮,然后单击陷入循环的程序,它将终止程序。 希望有帮助。

【讨论】:

【参考方案11】:

就我而言,当我在无休止地运行时尝试关闭它时,我的 sql 挂断了。所以我所做的是我打开我的任务管理器并结束我的 sql 查询任务。这停止了​​我的 sql 并重新启动它。

【讨论】:

【参考方案12】:

如果使用VSCode mssql Extension,点击F1,在提示符中写入mssql,选择“取消查询”,如@987654322所示@。

【讨论】:

这并不能真正回答手头的问题。如果他们通过 VSCode 询问如何做到这一点,那会更好,但一般来说更多的是关于 Sql Server。 它不适合主要问题之后的所有挑剔细节 - 如何立即终止/停止长 SQL 查询? - 我通过谷歌发现试图解决我的小变种。是的,我搜索了一个与我自己的细节更相关的问题。所以,当我找到这个问题的解决方案(以及我的客户中的这个细微差别)时,我添加了一个很大的免责声明——如果使用这样的客户端——你可以用这种方式取消。试图帮助别人......除了明显正交的答案之外,从来没有理解过这种***。但是,如果您认为删除它会更好,请标记为适度,蒂莫西。和平。

以上是关于如何立即终止/停止长 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

Qt中如何设置按钮点击终止线程

如何正确停止当前运行的 xCode 项目?

在 JDBC 中停止或终止长时间运行的查询

如何终止LINUX自启动

SQL查询耗时比预期长,如何优化?

Redshift - 终止启动 Redshift 查询的应用程序并不会终止它