查找最近在数据库上执行的所有查询

Pra*_*eti 22 sql-server ssms sql-server-2008-r2

[我是初级 T-SQL 程序员]
[..希望我在正确的堆栈交换站点上]

我想获得我执行的所有查询的列表(至少,我从早上开始执行的那些查询)。我需要报告查询的执行时间。

在线搜索并没有给我带来太多有用的信息。我在网上找到的唯一一个看起来很接近的查询是

SELECT
    deqs.last_execution_time AS [Time], 
    dest.TEXT AS [Query]
 FROM 
    sys.dm_exec_query_stats AS deqs
    CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY 
    deqs.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)

这个查询返回了一些奇怪的结果(其中大部分是一堆 sproc)。此外,所有这些结果都显示了从今天下午开始执行的查询(我需要从早上开始查询)。

我在之前的问题中找不到任何东西(如果已经问过类似的问题,请指点我)。

我看到了一些关于 SQL Profiler 的建议,但我想 Profiler 只有在我已经开始跟踪时才会帮助我(如果我错了,请纠正我)。

有人可以建议我如何获取从早上开始在数据库上执行的所有查询的列表(包括查询执行时间)。

[如果我也能以某种方式获得执行查询的用户的用户名,这将是有帮助的(不是必需的)]

Tho*_*ger 12

这个查询返回了一些奇怪的结果(其中大部分是一堆 sproc)。此外,所有这些结果都显示了从今天下午开始执行的查询(我需要从早上开始查询)。

那是因为您正在查看过程缓存,而早上使用的计划可能不再存在于那里(由于内存压力、服务器/实例重启、手动清除 proc 缓存等)。

获取针对实例(或更具体地说是数据库)执行查询的真正方法是创建 SQL 跟踪或扩展事件会话。正确创建,其中任何一个都会为您提供您正在寻找的信息。

如果您正在寻找今天早上且仅在今天早上的执行统计信息(即将上述监控实现设置为主动和下一次待办任务是不够的),那么除非已经创建,否则将没有方法本身来获取这些信息。

为了将来参考,从捕获SQL:StmtCompleted事件的 SQL 跟踪开始。在 XE 中,这将是sql_statement_completed事件。

在我看来,与其继续搜索查询执行统计信息的残余部分,不如开始花时间弄清楚如何重新执行您要测量的工作负载。但这次在此之前,设置适当的跟踪/监控。