一尘不染

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

sql-server

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

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

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

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

我在前面的问题中找不到任何内容(如果已经问过类似的问题,请指出)。

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

有人可以建议我应该如何获取自早上以来在数据库上执行的所有查询的列表(包括查询执行时间)..

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


阅读 64

收藏
2022-11-16

共1个答案

一尘不染

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

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

对实例(或更具体地说是数据库)执行查询的真正方法是创建 SQL 跟踪或扩展事件会话。如果创建得当,其中任何一个都会为您提供所需的信息。

如果您正在寻找今天早上且仅在今天早上的执行统计信息(即,将上述监控实施设置为主动和下次待办任务是不够的),那么除非已经创建,否则不会以本机方式获取此信息。

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

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

2022-11-16