SQL Server 查看近期执行 SQL 语句
在日常的数据库管理和运维中,了解最近执行的 SQL 语句是非常重要的,它可以帮助我们优化查询性能、监控系统健康和排查故障。在 SQL Server 中,有多种方法可以查看和分析近期执行的 SQL 语句。在本文中,我们将探讨几种常用的方法,并通过代码示例进行演示。
1. 使用系统视图查询最近执行的 SQL 语句
SQL Server 提供了一些系统视图,可以帮助我们获取最近执行的 SQL 语句。最常用的视图包括 sys.dm_exec_requests 和 sys.dm_exec_sql_text。
代码示例
以下是一个查询最近执行 SQL 语句的示例代码:
SELECT
r.session_id,
r.status,
r.start_time,
r.command,
r.cpu_time,
r.total_elapsed_time,
t.text AS sql_text
FROM
sys.dm_exec_requests r
CROSS APPLY
sys.dm_exec_sql_text(r.sql_handle) t
WHERE
r.session_id > 50 -- 过滤系统进程
ORDER BY
r.start_time DESC;
解释:上述查询首先通过 sys.dm_exec_requests 视图获取当前正在执行的请求信息,然后通过 CROSS APPLY 将每个请求的 SQL 文本提取出来。session_id > 50 用于过滤掉系统进程,当然您可以根据需要调整条件。最终结果按开始时间降序排列,以便查看最近的 SQL 语句。
2. 使用 SQL Server Profiler
SQL Server Profiler 是一个强大的工具,可以实时监控和分析 SQL Server 的活动。您可以使用它来捕获并查看执行的 SQL 语句。
步骤概览
- 打开 SQL Server Profiler。
- 创建新跟踪,选择适当的事件(如 RPC:Completed 和 SQL:BatchCompleted)。
- 启动跟踪并查看执行的 SQL 语句。
注意:持续使用 SQL Server Profiler 会对系统性能产生影响,因此建议在必要时使用,并避免在生产环境中长时间运行。
3. 使用动态管理视图(DMVs)
动态管理视图(DMVs)提供了有关 SQL Server 状态的信息,包括正在执行的查询。在开发和调试中,DMVs 能够提供极其有用的洞见。
以下是一个使用 DMVs 查看执行计划的示例:
SELECT
st.execution_count,
st.total_worker_time AS total_cpu_time,
st.total_elapsed_time,
st.total_logical_reads,
st.total_logical_writes,
st.last_execution_time,
t.TEXT AS sql_text
FROM
sys.dm_exec_query_stats st
CROSS APPLY
sys.dm_exec_sql_text(st.sql_handle) t
ORDER BY
st.last_execution_time DESC;
解释:在这个查询中,我们使用了 sys.dm_exec_query_stats 获取有关查询的统计信息,并通过 CROSS APPLY 提取 SQL 文本。这可以帮助我们找出频繁执行且消耗资源的查询。
4. 使用 SQL Server 日志
SQL Server 还可以通过设置事件日志来跟踪执行的 SQL 语句。通过配置 SQL Server Agent 作业,您可以将查询日志定期写入文件中,便于后续分析。
代码示例
下面是一个简单的例子,通过作业每天收集一次 SQL 查询的执行日志:
USE msdb;
GO
EXEC dbo.sp_add_job
@job_name = N'SQL Query Log';
GO
EXEC dbo.sp_add_jobstep
@job_name = N'SQL Query Log',
@step_name = N'Log Queries',
@subsystem = N'TSQL',
@command = N'
INSERT INTO YourLogTable (SqlText, LogDate)
SELECT t.text, GETDATE()
FROM sys.dm_exec_query_stats st
CROSS APPLY sys.dm_exec_sql_text(st.sql_handle) t
WHERE st.last_execution_time > DATEADD(day, -1, GETDATE());
',
@database_name = N'YourDatabase';
GO
EXEC dbo.sp_add_schedule
@schedule_name = N'Daily Schedule',
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 010000;
GO
EXEC sp_attach_schedule
@job_name = N'SQL Query Log',
@schedule_name = N'Daily Schedule';
GO
EXEC dbo.sp_add_jobserver
@job_name = N'SQL Query Log';
GO
解释:该脚本创建了一个作业,每天执行一次,记录最近执行的 SQL 语句到指定的日志表中。
甘特图展示
为了更好地理解 SQL 查询分析的不同步骤,可以使用甘特图展示不同方法的执行时间。
gantt
title SQL Query Analysis Steps
dateFormat YYYY-MM-DD
section 监控方法
系统视图 :done, des1, 2023-10-01, 5d
SQL Server Profiler :active, des2, 2023-10-06, 5d
动态管理视图 :done, des3, after des1, 5d
SQL Server 日志 :done, des4, after des3, 5d
结论
了解和查看近期执行的 SQL 语句是 SQL Server 数据库管理中的一项重要技能。通过系统视图、Profiler、DMVs 和作业等多个方法,我们可以全面监控 SQL Server 的活动。
在实施这些监控手段时,请注意系统性能的影响,并尽量在合适的环境中进行分析操作。希望本文中的示例和方法能够帮助您更高效地管理和优化 SQL Server 数据库。
















