如何在 sql server 中查看执行脚本的历史记录及其执行时间和计数?

Posted

技术标签:

【中文标题】如何在 sql server 中查看执行脚本的历史记录及其执行时间和计数?【英文标题】:How to see the history of executed scripts and their execution time and counts in sql server? 【发布时间】:2016-03-16 07:49:00 【问题描述】:

我想查找在我的 sql server 中运行的脚本的执行时间和执行次数。

例如,我在每个执行的脚本上添加了 /* searchThisString */。然后我使用以下代码找出它们。

SELECT  dest.text, deqs.last_execution_time, deqs.execution_count 
FROM    sys.dm_exec_query_stats AS deqs
        CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE   deqs.last_execution_time > '<time>'
        AND dest.text LIKE '%<searchThisString>%';

但是,有一种情况是此代码失败。如果脚本仅包含“更新”查询,则上述代码无法找到它:

例如,

example_script.sql

/*searchThisString*/
update <table> set colA = 'A' where colB = 'B'

那么上面的代码就找不到这个执行的脚本了。

更新: 我刚刚发现 sys.dm_exec_cached_plans 实际上可以找到所有执行的脚本。但是,它没有执行脚本的 last_execution_time 和 execution_count 信息。

我尝试使用以下代码将其与 sys.dm_exec_query_stats 结合(但它也不起作用)。我想是因为 sys.dm_exec_query_stats 没有这个已执行的查询,所以当我加入它们时,它返回 last_execution_time 的“null”和 execution_count 的“null”。

SELECT  dest.text, deqs.last_execution_time, deqs.execution_count 
FROM    sys.dm_exec_cached_plans AS decp
        CROSS APPLY sys.dm_exec_sql_text(decp.plan_handle) AS dest
LEFT JOIN sys.dm_exec_query_stats As deqs
ON decp.plan_handle = deqs.plan_handle
WHERE   deqs.last_execution_time > '<time>'
        AND dest.text LIKE '%<searchThisString>%';

更新 2: 结果如下:

【问题讨论】:

How to see query history in SQL Server Management Studio的可能重复 我在您建议的帖子中找到的解决方案实际上并不能解决我的问题。 【参考方案1】:

我反复执行下面的脚本

/***text***/

update test1 set name ='a'
where name ='test1'


update test1 set name='b'
where name='test2'

然后我在脚本下面执行以查看统计信息..

select txt.text,st.execution_count,st.total_worker_time 
from sys.dm_exec_query_stats st
cross apply
sys.dm_exec_sql_text(st.sql_handle) txt

我可以看到输出,即使只有更新语句..

此外,您可以从上面的片段中看到,cmets 没有被捕获。我建议检查实际脚本而不是 cmets 并进一步包装,将其存储在存储过程中以更清楚地查看整个批次

除了 where 子句外,您的查询没有任何问题。

【讨论】:

谢谢。我搜索评论而不是搜索查询的原因是我想搜索一批在评论中具有相同“关键字”的脚本。我可以看到 dm_exec_cached_plans 也保存了脚本和注释,而 dm_exec_query_stats 保存了脚本但没有 cmets。我相信加入这两个表是解决方案。但是,当我尝试加入它们时,我找不到它们之间的“通用”键。你有什么想法吗? 非常感谢。就像我说的,它可以显示“选择”查询(就像您的测试结果中显示的一样)。但它不能显示“更新”查询。请参考我的“update2”,【参考方案2】:

使用SQL Server profiler 查看执行的查询。

另见How to see query history in SQL Server Management Studio。

【讨论】:

感谢您的建议。让我来看看这个 SQL Server Profiler。

以上是关于如何在 sql server 中查看执行脚本的历史记录及其执行时间和计数?的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 中如何用脚本管理作业

如何查看mysql执行的所有以往 sql 语句历史命令

sql server 用脚本管理作业

如何查看SQL Server2000执行过的SQL语句

如何在 SQL Server Management Studio 中查看查询历史记录

如何查看mysql中执行sql语句