我们目前正在管理运行存储过程的Web应用程序,只要用户搜索特定项目,就会触发其中一个。不幸的是,有一天我们遇到了一个非常严重的问题,因为它长时间运行,因此导致数据库执行得非常糟糕。这最终给我们的应用程序带来了很多问题。我发现长时间运行的查询通过运行此数据库脚本导致了问题:
SELECT sqltext.TEXT,
req.session_id,
req.status,
req.command,
req.cpu_time,
req.total_elapsed_time
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
where
sqltext.[Text] NOT LIKE '--''check%'
ORDER BY req.cpu_time DESC
所以我们解决这个问题的方法是执行KILL [SESSION_ID],几秒钟后我们的应用程序恢复正常。现在,我们想主动处理这类问题,所以当我说控制时,我想知道Web应用程序是否可能在一段时间或一段时间之后优雅地终止此会话(不会导致后续问题)或应该它在SQL Server本身内处理?
如果还有人需要进一步澄清,请随时发表评论。
答案 0 :(得分:0)
以下是获取执行计划的步骤 步骤1 请修改日期,proc db name
select distinct top 1000 qs.plan_handle,o.name,d.name--,--ps.database_id
from sys.dm_exec_query_stats qs
,sys.dm_exec_procedure_stats ps
,sys.objects o
,sys.databases d
where qs.last_execution_time > '2017-03-29 17:06:42.340'
and qs.last_execution_time < '2017-03-30 18:19:45.653'
and ps.sql_handle = qs.sql_handle
and o.object_id = ps.object_id
AND o.name = 'Your proc name here'
AND d.database_id = ps.database_id
AND d.name = 'database name '
第2步 将输出设置为grid并保存为.sqlplan 你得到一个链接,如果你有足够的权限,你可以点击它,它将打开。确保设置了查询输出选项,以便给出足够的空间 用于xml输出。
select query_plan
from sys.dm_exec_query_plan (copy your handle here from step 1, do no use quotes)