Tom*_*m V 16
我不指望你会在 2016 年,因为它最近才发布(在撰写本文时),但如果你有 2016 年的服务器并且你的数据库启用了查询存储,你可以在那里查看你的查询。
查看Query Store 的文档,其中列出了以下示例用例:
确定在给定时间窗口内执行查询的次数,帮助 DBA 解决性能资源问题。
确定过去 x 小时内的前 n 个查询(按执行时间、内存消耗等)。
如果您想记录您的查询以供将来查看,您可以查看扩展事件或服务器端跟踪,具体取决于您的服务器版本。
如果您运行的是 SQL 2005+,您可以使用这篇解释服务器端跟踪的文章记录查询。
如果您运行的版本比 2008 年更新,您可以使用扩展事件,这将被推荐用于服务器端跟踪。
查看Paul Randal 在这里发布的查询,向您展示了如何使用扩展事件记录昂贵的查询。您可以修改WHERE来自该查询的 以记录所有查询。
话虽如此,我认为记录所有查询并不是一个好主意。如果您有一个相当活跃的生产系统,它会真正减慢您的系统速度。至少有几个过滤器,并记录尽可能少的数据。
如果您没有设置任何日志记录,则无法追溯且可靠地获取该信息。
您可以获得的最接近的是使用以下内容查询计划缓存:
SELECT
sql_text.text,
st.last_execution_time,
DB_NAME(qp.dbid) as databasename
FROM sys.dm_exec_query_stats st
CROSS APPLY sys.dm_exec_sql_text(st.sql_handle) AS sql_text
INNER JOIN sys.dm_exec_cached_plans cp
ON cp.plan_handle = st.plan_handle
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) as qp
WHERE st.last_execution_time >= DATEADD(week, -1, getdate())
ORDER BY last_execution_time DESC;
Run Code Online (Sandbox Code Playgroud)
这将列出上周执行的所有查询,这些查询仍然在缓存中保留计划以及上次执行时间和数据库名称(除非它是准备好的语句)。
但是您需要意识到这并不能保证让您获得所有查询,因为有多种原因可以执行查询,但永远不会或不再有缓存计划。
例如,有一些方法可以删除整个计划缓存或驱逐单个计划
如果优化临时工作负载处于活动状态,则此查询将不会检索仅执行一次的查询,并且曾经存储在缓存中的计划可能会被任何导致计划重新编译的计划(例如更新的统计信息)逐出缓存, DDL 语句、索引重建等。通读本白皮书列出导致计划重新编译的所有情况。