我认为我在SQL Server 2017中是一个相当简单的存储过程。它基本上只是从三个表中删除一些数据,并在事务内完成。
我有此存储过程的删除/创建脚本,这些脚本作为Entity Framework播种的一部分运行。这是创建过程的唯一位置,并且根据日志记录语句,它似乎只能按预期在部署时执行一次。
这是问题所在...有时我会遇到一些严重的性能问题,它们似乎与数据库性能有关。当我查看应用程序日志时,我看到此存储过程正在执行。但是,当我查看当前正在执行的查询时,它正在尝试为此存储过程运行创建过程查询。
我正在使用以下查询来查看正在运行的查询:
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
我对SQL Server有相当的经验,但是对存储过程却没有那么多的经验,而且我似乎找不到任何建议创建过程查询应作为执行存储过程的一部分运行的文档。
运行创建过程很奇怪吗?还是执行存储过程时正常?
答案 0 :(得分:0)
这是正常的。如果要查看正在执行的特定语句,则需要使用statement_start_offset
中的statement_end_offset
和sys.dm_exec_requests
:
SELECT
CASE
WHEN req.[statement_start_offset] > 0 THEN
CASE req.[statement_end_offset]
WHEN -1 THEN
SUBSTRING(sqltext.TEXT, (req.[statement_start_offset]/2) + 1, 2147483647)
ELSE
SUBSTRING(sqltext.TEXT, (req.[statement_start_offset]/2) + 1, (req.[statement_end_offset] - req.[statement_start_offset])/2+1)
END
ELSE
CASE req.[statement_end_offset]
WHEN -1 THEN
RTRIM(LTRIM(sqltext.[text]))
ELSE
LEFT(sqltext.TEXT, (req.[statement_end_offset]/2) +1)
END
END AS [executing statement],
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
答案 1 :(得分:0)
这进一步说明了这个问题:
sys.dm_exec_sql_text DMF仅返回SQL查询的文本 执行查询文本以及其他详细信息(dbid,objectid等)。
如果您正在执行即席执行,您将看到执行语句。但 对于proc,它将选择proc的文本而不是执行语句。
如果要获取当前执行的部分:
SELECT r.session_id ,
OBJECT_NAME(qt.objectid, qt.dbid) AS [Stored procedure name],
SUBSTRING(qt.[text], r.statement_start_offset / 2,
( CASE WHEN r.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.[text])) * 2
ELSE r.statement_end_offset
END - r.statement_start_offset ) / 2) AS [statement_executing]
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS qt
WHERE r.session_id > 50
中找到了它