如何在SQL Server数据库中识别长时间运行的查询?

时间:2017-05-07 13:13:22

标签: sql-server stored-procedures

我们正在生产数据库中面临长时间运行的查询。我们尝试运行查询以识别长时间运行的会话。我们还尝试运行查询以确定哪个存储过程运行时间很长。之后,返回的结果没有记录。意思是,没有这样的存储过程可以运行很长时间。

查询以识别长时间运行的查询会话:

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

这是长时间运行会话的片段:

(@p__linq__0 datetime2(7),@p__linq__1 datetime2(7),@p__linq__2 int)SELECT TOP (1) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[LogType] AS [LogType], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[CreatedDate] AS [CreatedDate]
    FROM [dbo].[Log] AS [Extent1]
    WHERE (7 =  CAST( [Extent1].[LogType] AS int)) AND ( CAST( [Extent1].[LogType] AS int) IS NOT NULL) AND ([Extent1].[CreatedDate] >= @p__linq__0) AND ([Extent1].[CreatedDate] <= @p__linq__1) AND ((([Extent1].[UserId] = @p__linq__2) AND ( NOT ([Extent1].[UserId] IS NULL OR @p__linq__2 IS NULL))) OR (([Extent1].[UserId] IS NULL) AND (@p__linq__2 IS NULL)))

我们尝试使用此查询来识别长时间运行的存储过程:

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FROM \[dbo\].\[Logs\]%' ESCAPE '\'

我们需要一些关于如何识别长时间运行的查询而不是检查存储过程的帮助。

1 个答案:

答案 0 :(得分:1)

长时间运行的会话查询的结果表明它是从Entity Framework生成的参数化查询,而不是存储过程中的语句。因此,如果您发现具有类似查询文本的过程,那只是巧合,而不是罪魁祸首。

我建议您使用sys.dm_exec_query_plan检索查询计划。对于WHERE子句中指定的列,可能需要在日志表上添加其他索引。此外,CAST( [Extent1].[LogType] AS int))可能是一个问题,因为这是一个非sargable表达式。