查询历史是否存储在一些日志文件中?如果有,你能告诉我怎么找到他们的位置吗?如果没有,你能给我一些建议吗?


当前回答

[因为这个问题可能会作为一个重复的问题结束。]

如果SQL Server还没有重新启动(并且计划还没有被清除等等),您可能能够在计划缓存中找到该查询。

SELECT t.[text]
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
WHERE t.[text] LIKE N'%something unique about your query%';

如果你因为Management Studio崩溃而丢失了文件,你可以在这里找到恢复文件:

C:\Users\<you>\Documents\SQL Server Management Studio\Backup Files\

否则,你将需要使用其他工具来帮助你保存查询历史,比如Ed Harper的回答中提到的SSMS Tools Pack——尽管它在SQL Server 2012+中不是免费的。或者您可以设置一些轻量级跟踪过滤您的登录名或主机名(但请使用服务器端跟踪,而不是Profiler)。


正如@Nenad-Zivkovic评论的那样,加入sys可能会有帮助。Dm_exec_query_stats和last_execution_time排序:

SELECT t.[text], s.last_execution_time
FROM sys.dm_exec_cached_plans AS p
INNER JOIN sys.dm_exec_query_stats AS s
   ON p.plan_handle = s.plan_handle
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
WHERE t.[text] LIKE N'%something unique about your query%'
ORDER BY s.last_execution_time DESC;

其他回答

如果您需要通过SMSS执行的查询的历史记录。

你可能想试试SSMSPlus。

https://github.com/akarzazi/SSMSPlus

这个特性在SSMS中并不是现成的。

您需要SSMS 18或更新版本。

声明:我是作者。

系统不会以这种方式记录查询。如果你知道你想提前这么做,你可以使用SQL Profiler来记录将要输入的内容,并在Profiler运行期间跟踪查询。

你可以使用“每次保存自动生成脚本”,如果你使用管理工作室。 这当然不是日志。 检查一下是否对你有用。;)

晚一点,但希望有用,因为它增加了更多的细节…

在默认情况下,无法查看在SSMS中执行的查询。不过也有几种选择。

读取事务日志-这不是一件容易的事情,因为它是私有格式。但是,如果您需要查看历史上执行的查询(除了SELECT),这是唯一的方法。

您可以使用第三方工具,如ApexSQL日志和SQL日志救援(免费,但仅限SQL 2000)。查看这个线程的更多细节在这里SQL Server事务日志资源管理器/分析器

SQL Server分析器-最适合如果你只是想开始审计,你不感兴趣之前发生了什么。确保使用筛选器只选择您需要的事务。否则你很快就会得到大量的数据。

SQL Server跟踪—如果您想捕获所有或大部分命令,并将它们保存在跟踪文件中,以便稍后进行解析,则最适合。

触发器—如果您想捕获DML(除了select)并将它们存储在数据库中的某个地方,那么最适合使用它

我相信在座各位的回答。

这个脚本展示了如何找到影响SQL的最慢的20个查询

select top 20 dest.text, deqs.execution_count, deqs.total_elapsed_time, deqs.total_worker_time,
(deqs.total_elapsed_time / deqs.execution_count) as 'avg_elapse_time',
(deqs.total_worker_time / deqs.execution_count) as 'avg_worker_time'
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 >= '2021-09-27 16:00' /* YOUR DATE AND TIME HERE*/
order by 'avg_elapse_time' desc