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

时间:2017-07-24 09:27:12

标签: sql-server

有时我的应用程序运行缓慢。主要问题是一些昂贵的报告正在运行。我怎样才能找到这些报告以及如何立即杀死这些报告?

3 个答案:

答案 0 :(得分:0)

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

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

<强>更新
您对sp_WhoIsActive输出的前两列感兴趣。 第一列定义查询运行的时间。第二列是查询的session_id(或SPID) 例如,您可以使用KILL 60来终止session_id 60 有关存储过程的详细说明,请查看here

答案 1 :(得分:0)

我为您提供了一些建议,但并非所有建议都适合您。

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

答案 2 :(得分:0)

您可以使用以下命令获取长时间运行的查询。

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 
例如,

杀死session_id 60。