在 SQL 服务器中记录嵌套存储过程
Logging of nested stored procedures in SQL Server
如何单独记录父存储过程执行的嵌套存储过程的信息?
示例:
CREATE PROCEDURE dbo.usp_ParentProcedure
AS
BEGIN
EXEC dbo.usp_ChildProcedure1
EXEC dbo.usp_ChildProcedure2
EXEC dbo.usp_ChildProcedure3
END
GO
理想情况下,我想记录交易时间,I/0,CPU 单独使用每个嵌套存储过程,同时只修改父过程。
原因是嵌套过程经常被其他用户添加到父过程或从父过程中删除,我们都知道让每个人都遵循创建协议是一项非常艰巨的工作。
Aaron Bertrand 在这里分享了他记录单个存储过程的解决方案
http://www.mssqltips.com/sqlservertip/2003/simple-process-to-track-and-log-sql-server-stored-procedure-use/
如果有人可以帮助我扩展它以涵盖我上面的场景,我将不胜感激。
谢谢
尼尔
在花了一些时间查看 dm 表后,我发现 运行 这个查询 after 执行 parent 存储过程 returns 有关子存储过程的一些有用信息。
SELECT
DB_NAME (s.database_id),
s.[object_id],
p.name,
s.sql_handle,
s.plan_handle,
s.last_worker_time,
s.last_elapsed_time,
s.last_physical_reads,
s.last_logical_writes,
s.last_logical_reads,
p2.name,
p2.[object_id]
FROM sys.dm_exec_procedure_stats s
INNER JOIN sys.procedures p
ON s.[object_id] = p.[object_id]
LEFT JOIN sys.procedures p2 --join to identify parent procedure from results
ON p2.[object_id] = (
select top 1 s.[object_id]
from sys.dm_exec_procedure_stats s
inner join sys.procedures p
ON s.[object_id] = p.[object_id]
order by s.total_worker_time desc
)
WHERE s.[object_id] <> p2.[object_id]
AND s.[object_id] <> @@PROCID
如何单独记录父存储过程执行的嵌套存储过程的信息?
示例:
CREATE PROCEDURE dbo.usp_ParentProcedure
AS
BEGIN
EXEC dbo.usp_ChildProcedure1
EXEC dbo.usp_ChildProcedure2
EXEC dbo.usp_ChildProcedure3
END
GO
理想情况下,我想记录交易时间,I/0,CPU 单独使用每个嵌套存储过程,同时只修改父过程。
原因是嵌套过程经常被其他用户添加到父过程或从父过程中删除,我们都知道让每个人都遵循创建协议是一项非常艰巨的工作。
Aaron Bertrand 在这里分享了他记录单个存储过程的解决方案 http://www.mssqltips.com/sqlservertip/2003/simple-process-to-track-and-log-sql-server-stored-procedure-use/
如果有人可以帮助我扩展它以涵盖我上面的场景,我将不胜感激。
谢谢
尼尔
在花了一些时间查看 dm 表后,我发现 运行 这个查询 after 执行 parent 存储过程 returns 有关子存储过程的一些有用信息。
SELECT
DB_NAME (s.database_id),
s.[object_id],
p.name,
s.sql_handle,
s.plan_handle,
s.last_worker_time,
s.last_elapsed_time,
s.last_physical_reads,
s.last_logical_writes,
s.last_logical_reads,
p2.name,
p2.[object_id]
FROM sys.dm_exec_procedure_stats s
INNER JOIN sys.procedures p
ON s.[object_id] = p.[object_id]
LEFT JOIN sys.procedures p2 --join to identify parent procedure from results
ON p2.[object_id] = (
select top 1 s.[object_id]
from sys.dm_exec_procedure_stats s
inner join sys.procedures p
ON s.[object_id] = p.[object_id]
order by s.total_worker_time desc
)
WHERE s.[object_id] <> p2.[object_id]
AND s.[object_id] <> @@PROCID