如何在SQL Server中查找当前长时间运行的查询,并立即终止它们?

13

有时我的应用程序运行缓慢。主要问题是一些耗费资源的报告正在运行。我应该如何找到这些报告,以及如何立即终止它们?


你应该看一下这个问题:https://dev59.com/yHI-5IYBdhLWcg3wZ3fC 。我认为它会解决你的问题。 - Fotis Grigorakis
@FotisGrigorakis 这不是 OP 寻找的答案。你的回答谈到了缓存(以及清除它)。 - NickyvV
哦,是的,你说得对,抱歉!是我的错。 - Fotis Grigorakis
3个回答

18
您可以使用以下命令获取长时间运行的查询。
SELECT r.session_id,
       st.TEXT AS batch_text,
       qp.query_plan AS 'XML Plan',
       r.start_time,
       r.status,
       r.total_elapsed_time
FROM sys.dm_exec_requests AS r
     CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
     CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp
WHERE DB_NAME(r.database_id) = '{db_name}'
ORDER BY cpu_time DESC;

那么您可以使用

KILL 60 

例如,要终止会话ID为60的会话。


3

我总是使用Adam Machanic的sp_WhoIsActive来查找长时间运行的查询。
sp_WhoIsActive在dba.stackexchange.com上有详细描述。

虽然你也可以编写自己的脚本或者例如使用sp_who2

更新
您对sp_WhoIsActive的输出的前两列感兴趣。 第一列定义了查询运行的时间长度。第二列是查询的会话ID(或SPID)。
例如,您可以使用KILL 60 来杀死会话ID为60的查询。
请参阅此处以获取存储过程的详细说明。


我对SQL还很陌生。那么,在sp_whoisactive或sp_who2之后,我们如何知道哪个进程在运行时间过长并如何将其终止? - Prudhviraj kamineni
@Prudhvirajkamineni 你解决了吗?我回答了你的问题吗?能否标记一下,以便其他用户可以找到它? - NickyvV
嗨Nicky,你的答案非常好,谢谢。 - Prudhviraj kamineni
@Prudhvirajkamineni,太好了,你能把它标记为答案吗? - NickyvV

1

我有几条建议,但并不都适用于你:

1- 报告和CRUD操作必须分开。至少你可以使用nolock或在晚上运行它们并且可以离线工作。 2- 检查你的查询,因为如果数据量小于 2,000,000 ,主要问题是查询花费太多时间。 3- 分析报告类型,如果适合离线工作,则使用离线系统进行报告。 4- 可以使用镜像或其他技术进行报告。 5- 最佳实践是将数据库始终分开为报告和CRUD操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接