SQL Server 查看近期执行 SQL 语句

在日常的数据库管理和运维中,了解最近执行的 SQL 语句是非常重要的,它可以帮助我们优化查询性能、监控系统健康和排查故障。在 SQL Server 中,有多种方法可以查看和分析近期执行的 SQL 语句。在本文中,我们将探讨几种常用的方法,并通过代码示例进行演示。

1. 使用系统视图查询最近执行的 SQL 语句

SQL Server 提供了一些系统视图,可以帮助我们获取最近执行的 SQL 语句。最常用的视图包括 sys.dm_exec_requestssys.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 语句。

步骤概览

  1. 打开 SQL Server Profiler。
  2. 创建新跟踪,选择适当的事件(如 RPC:Completed 和 SQL:BatchCompleted)。
  3. 启动跟踪并查看执行的 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 数据库。