sql server 查询历史执行的sql情况

select *from (
SELECT qs.creation_time AS ExecutionTime,
       SUBSTRING(qt.text, (qs.statement_start_offset/2)+1, ((CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END-qs.statement_start_offset)/2)) AS QueryText,
       qp.query_plan AS ExecutionPlan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
)A
where 
 ---QueryText like '%ods%' and 
 ExecutionTime >= '2024-01-24'
order by ExecutionTime desc

<think>好的,我现在需要帮助用户解决在SQL Server查询历史执行语句的问题。首先,我得回忆一下自己之前学过的相关知识,或者有没有遇到过类似的情况。记得SQL Server有一些动态管理视图(DMVs)可以用来追踪执行历史,比如sys.dm_exec_query_stats或者sys.dm_exec_sql_text,不过这些可能只保留在缓存中的语句,不是所有的历史记录都会被保存下来。 另外,用户可能需要更持久的历史记录,这时候可能需要启用SQL Server的审计功能或者使用SQL Server Profiler来跟踪。不过Profiler是实时监控工具,可能不适合查询过去执行过的语句。审计功能需要预先配置,可能用户没有开启的话,可能无法回溯数据。 还有一种方法是查询默认的跟踪日志SQL Server有一个默认跟踪功能,可以记录一些关键事件,包括执行的语句。不过默认跟踪可能只保留有限的数据量,时间太久的话可能被覆盖了。 另外,是否考虑第三方工具或者自定义触发器来记录执行的语句?不过这可能超出了用户当前的需求范围,用户可能更倾向于使用内置的功能。 需要分步骤来回答,首先介绍使用动态管理视图的方法,然后讨论审计和跟踪选项,以及需要注意的权限问题。同时,要提醒用户这些方法的限制,比如数据保留时间,是否需要预先配置等。 可能用户没有开启审计,所以动态管理视图可能是最直接的,但只能获取缓存中的执行计划相关的SQL。如果缓存被清空,比如服务器重启,这些信息就会丢失。这时候可能需要建议用户定期收集数据或者启用更持久的审计策略。 另外,生成相关问题的时候,需要考虑用户可能的后续疑问,比如如何优化查询性能,或者如何启用审计功能,或者如何分析执行计划等。 现在需要确保回答结构清晰,步骤明确,并且语法正确,使用中文,同时按照要求使用行内公式和独立公式的格式。不过这个问题可能不涉及数学公式,所以可能不需要使用LaTeX数学表达式,但如果有提到比如统计信息之类的,可能需要用变量表示。 不过根据用户的问题,可能不需要数学公式,但系统级指令要求所有行内数学表达式用$...$,所以如果有的话需要注意。不过当前问题可能不涉及,所以可能可以忽略这部分,但需要检查。 最后,确保回答中引用的部分有引用标识,但用户提供的参考引用是空的,可能需要自行处理,或者如果没有引用来源的话,可能不需要添加。不过根据示例,引用的标记是存在的,所以可能需要查找是否有相关引用来源,但用户没有给出,所以可能暂时不添加,或者在提到某些功能时引用官方文档。 总结回答步骤: 1. 使用动态管理视图(如sys.dm_exec_query_stats)结合sys.dm_exec_sql_text来查询缓存中的执行语句。 2. 使用SQL Server审计功能,需要预先配置。 3. 使用默认跟踪或扩展事件(Extended Events)来捕获历史语句。 4. 提到第三方工具或自定义解决方案的可能性,但主要推荐内置方法。 5. 注意事项,如权限要求、数据保留时间限制等。 然后生成相关问题,比如如何启用审计,如何分析查询性能,如何清理缓存等。</think>在SQL Server查询历史执行语句的常用方法如下: ### 一、使用动态管理视图(DMV) 1. **查询缓存中的执行语句** ```sql SELECT t.text AS [SQL语句], s.execution_count AS [执行次数], s.last_execution_time AS [最后执行时间] FROM sys.dm_exec_query_stats s CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) t ORDER BY s.last_execution_time DESC ``` - **特点**:仅显示仍在缓存中的语句(重启服务后数据丢失)[^1] - **权限要求**:需`VIEW SERVER STATE`权限 ### 二、启用SQL Server审计 2. **配置审计功能** ```sql -- 创建服务器审计 CREATE SERVER AUDIT SQLAudit TO FILE (FILEPATH = 'D:\Audit\') WITH (ON_FAILURE = CONTINUE) -- 创建数据库审计规范 CREATE DATABASE AUDIT SPECIFICATION QueryCapture FOR SERVER AUDIT SQLAudit ADD (SELECT, INSERT, UPDATE, DELETE ON DATABASE::YourDB BY public) WITH (STATE = ON) ``` - **数据查询**:审计日志存储在`.sqlaudit`文件中,需通过`sys.fn_get_audit_file`函数读取 - **优势**:支持长期存储和合规性要求 ### 三、使用扩展事件(Extended Events) 3. **创建事件会话** ```sql CREATE EVENT SESSION QueryTracking ON SERVER ADD EVENT sqlserver.sql_statement_completed ADD TARGET package0.event_file(SET filename=N'D:\XE\QueryTracking.xel') WITH (STARTUP_STATE=ON) ``` - **数据分析**:通过`sys.fn_xe_file_target_read_file`解析`.xel`文件 - **资源消耗**:比Profiler更轻量级 ### 四、默认跟踪日志 4. **查询默认跟踪** ```sql SELECT te.name AS [事件类型], t.DatabaseName, t.TextData FROM fn_trace_gettable((SELECT TOP 1 path FROM sys.traces), DEFAULT) t JOIN sys.trace_events te ON t.EventClass = te.trace_event_id WHERE te.name = 'SQL:StmtCompleted' ``` - **限制**:仅保留最近5MB数据,循环覆盖存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值