有时我的应用程序运行缓慢。主要问题是一些耗费资源的报告正在运行。我应该如何找到这些报告,以及如何立即终止它们?
有时我的应用程序运行缓慢。主要问题是一些耗费资源的报告正在运行。我应该如何找到这些报告,以及如何立即终止它们?
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的会话。
我总是使用Adam Machanic的sp_WhoIsActive来查找长时间运行的查询。
sp_WhoIsActive在dba.stackexchange.com上有详细描述。
虽然你也可以编写自己的脚本或者例如使用sp_who2
。
更新
您对sp_WhoIsActive的输出的前两列感兴趣。
第一列定义了查询运行的时间长度。第二列是查询的会话ID(或SPID)。
例如,您可以使用KILL 60
来杀死会话ID为60的查询。
请参阅此处以获取存储过程的详细说明。
我有几条建议,但并不都适用于你:
1- 报告和CRUD操作必须分开。至少你可以使用nolock或在晚上运行它们并且可以离线工作。 2- 检查你的查询,因为如果数据量小于 2,000,000 ,主要问题是查询花费太多时间。 3- 分析报告类型,如果适合离线工作,则使用离线系统进行报告。 4- 可以使用镜像或其他技术进行报告。 5- 最佳实践是将数据库始终分开为报告和CRUD操作。