我尝试捕获一些用于记录目的的统计参数。“SET 参数”没有选项(即设置统计时间)。
所以我试图查询一些DMV:
select '3AAAAAAAAAAA';
--no GO-statement here
select
total_worker_time/execution_count AS [Avg CPU Time],
total_elapsed_time as [Elapsed Time],
total_rows as [Total rows],
st.text,
(select cast(text as varchar(4000)) from ::fn_get_sql((select sql_handle from sys.sysprocesses where spid = @@spid)))
from sys.dm_exec_query_stats AS qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st
--where ???
order by creation_time desc
这里捕获的信息几乎是我需要的 - 但是:
该查询仅在 DMV 的结果中列出,当它在最后执行的 GO-Block 中运行时(不是在实际中)。这不是我需要的。我需要@@error 或@@rowcount 之类的东西在同一个GO 块中可用并保存经过的时间和CPU 时间。任何想法如何查询最后一条语句的信息?
如果可以解决:我想查询会话(@@spid)中的“最后一个”语句执行,而无需两次编写语句。
问题更新:
此查询正在“按会话”运行,并将列出请求的值(尽管缺少琐碎的查询)。Top 1 总是会带回最后一个 Statement 的值(如果通过 exec @SQL 触发则不会产生另一个会话):
print 'hello';
select top 10 'my personal identifier: 1', * FROM sys.messages;
select top 20 'my personal identifier: 2', * FROM sys.messages;
print 'hello';
select 'hello';
select top 30 'my personal identifier: 3', * FROM sys.tables;
select top 1
total_worker_time/execution_count AS [Avg CPU Time],
total_elapsed_time as [Elapsed Time],
total_rows as [Total rows],
substring(st.text, (qs.statement_start_offset / 2) + 1, (case when qs.statement_end_offset = -1 then datalength(st.text) else qs.statement_end_offset end - qs.statement_start_offset ) / 2 + 5) as [executing statement]
from sys.dm_exec_query_stats AS qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st
where st.text = (select cast(text as varchar(4000)) from ::fn_get_sql((select sql_handle from sys.sysprocesses where spid = @@spid)))
order by qs.statement_start_offset desc;
过滤器(where 子句)似乎很粗糙,而且不是很健壮。有什么办法可以改善这一点吗?