SQL Server如何查看近一周历史执行的SELECT查询语句
SQL Server历史查询记录提取方案
查询不到历史SELECT记录的原因
你当前使用的sys.dm_exec_query_stats属于内存级动态管理视图,存储的查询统计数据仅保留在SQL Server计划缓存中,以下任意场景都会导致历史记录被清除:
- SQL Server实例重启
- 服务器内存压力触发计划缓存自动回收
- 查询计划到期被系统自动移除
- 手动执行了计划缓存清理操作
因此你只能查询到近期仍留在缓存中的记录,无法获取更早的SELECT语句属于正常现象。
你提交的查询语法修正
你提供的第一段查询存在语法错误,排序子句缺少指定字段,修正后可正常查询当前计划缓存中的记录:
SELECT dest.text, deqs.creation_time FROM sys.dm_exec_query_stats AS deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest ORDER BY deqs.creation_time ASC
可长期提取历史查询记录的工具/方法
- 查询存储(Query Store)
SQL Server 2016及以上版本内置功能,数据持久化存储在磁盘中,开启后可自动留存所有执行过的查询语句(含SELECT)和对应的执行统计、执行计划,支持按时间范围筛选查询历史,是官方首推的查询历史追踪方案。
开启参考语句:ALTER DATABASE [你的数据库名称] SET QUERY_STORE = ON; - 扩展事件(Extended Events)
SQL Server轻量级追踪工具,性能损耗极低,可自定义配置捕获所有SELECT、事务类查询,支持将追踪结果持久化存储到本地文件,可按需配置日志保留周期,适合长期追踪查询历史。 - SQL Server审计(SQL Server Audit)
基于安全策略的审计功能,可精准配置需要捕获的查询类型、操作对象,审计日志可存储到本地文件或Windows安全日志,满足合规场景下的历史查询回溯需求。 - SQL Trace(已弃用,仅兼容老版本)
SQL Server 2016之前版本可用的追踪方案,可捕获所有执行的SQL语句并存储为trace文件,性能损耗高于扩展事件,仅建议低版本环境临时使用。
注意事项
如果之前没有提前开启上述任意一种持久化追踪功能,已经被从计划缓存中清除的历史SELECT查询记录无法再恢复,需先配置对应追踪工具后才能留存后续的查询历史。
内容的提问来源于stack exchange,提问作者Ryan Ternier
相关产品推荐
相关产品推荐

