2025-11-10
SQLSERVER
00

目录

DMVs 简介
实例数据和脚本
数据库环境准备
Orders表结构:
插入测试数据
识别慢查询
1. 使用sys.dmexecquerystats和sys.dmexecsqltext
2. 使用sys.dmexecrequests和sys.dmexecsql_text
3. 分析查询执行计划
分析结果
创建索引
结论

在数据库管理中,性能调优是确保应用程序高效运行的关键任务之一。SQL Server提供了动态管理视图(Dynamic Management Views,DMVs),这些视图是理解数据库行为、监控性能并识别慢查询的重要工具。在本文中,我们将探讨如何使用DMVs来找出执行效率低下的查询,并提供一些实例数据和脚本来模拟这一过程。

DMVs 简介

DMVs是SQL Server内部的一组视图和函数,它们提供了有关SQL Server实例状态的信息。这些信息对于性能监控和故障排除至关重要。对于性能调优,我们主要关注以下几个DMVs:

  • sys.dm_exec_query_stats:提供有关查询性能统计信息的视图。
  • sys.dm_exec_sql_text:返回与指定SQL句柄关联的SQL文本。
  • sys.dm_exec_query_plan:返回指定SQL句柄的查询执行计划。
  • sys.dm_exec_requests:提供有关当前执行的SQL请求的信息。

实例数据和脚本

为了演示如何使用DMVs识别慢查询,我们将创建一个简单的数据库环境,并插入一些测试数据。

数据库环境准备

假设我们有一个销售数据库SalesDB,其中包含一个表Orders

Orders表结构:

SQL
CREATE TABLE Orders ( OrderID INT IDENTITY PRIMARY KEY, CustomerID INT, OrderDate DATETIME, TotalAmount MONEY );

插入测试数据

我们将插入一些测试数据来模拟真实的业务场景。

SQL
-- 插入Orders数据 INSERT INTO Orders (CustomerID, OrderDate, TotalAmount) VALUES (1, '2023-01-01', 500.00), (2, '2023-01-02', 1500.00), (3, '2023-01-03', 200.00), (4, '2023-01-04', 750.00), (5, '2023-01-05', 250.00);

识别慢查询

1. 使用sys.dm_exec_query_stats和sys.dm_exec_sql_text

我们可以查询sys.dm_exec_query_stats视图来找出执行时间最长的查询,并使用sys.dm_exec_sql_text函数获取这些查询的SQL文本。

SQL
SELECT TOP 5 qs.total_elapsed_time / qs.execution_count AS avg_elapsed_time, qs.execution_count, qs.total_logical_reads, qs.total_logical_writes, st.text AS query_text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st ORDER BY avg_elapsed_time DESC;

image.png

这个查询将返回平均执行时间最长的前5个查询,它们的执行次数、逻辑读取和逻辑写入次数,以及查询的文本。

2. 使用sys.dm_exec_requests和sys.dm_exec_sql_text

如果我们想要监控当前正在执行的慢查询,我们可以查询sys.dm_exec_requests视图。

SQL
SELECT r.session_id, r.start_time, r.status, r.command, r.wait_type, r.wait_time, r.total_elapsed_time, st.text AS query_text FROM sys.dm_exec_requests AS r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st WHERE r.total_elapsed_time > 1000 -- 指定阈值(例如1000毫秒) ORDER BY r.total_elapsed_time DESC;

image.png

这个查询将返回当前执行时间超过1000毫秒的查询,它们的会话ID、开始时间、状态、等待类型、等待时间和查询文本。

3. 分析查询执行计划

对于已经识别的慢查询,我们可以进一步分析它们的执行计划,寻找优化机会。

SQL
SELECT qp.query_plan FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp WHERE qs.total_elapsed_time / qs.execution_count > 1000 -- 指定阈值(例如1000毫秒)

这个查询将返回平均执行时间超过1000毫秒的查询的执行计划。

分析结果

通过上述查询,我们可以识别出执行效率低下的查询。分析这些查询的执行计划,我们可能会发现缺少索引、查询设计不佳或其他问题。然后,我们可以根据这些信息进行查询优化或调整数据库设计。

创建索引

SQL
CREATE NONCLUSTERED INDEX idx_CustomerID ON Orders(CustomerID);

创建索引后,再次执行慢查询识别脚本,我们应该能看到性能有所提升。

结论

使用DMVs是SQL Server性能调优的一个强大工具。通过监控查询的执行时间、逻辑读写次数等指标,我们可以找出并优化慢查询。这些操作可以显著提高数据库的整体性能,从而为用户提供更快的应用程序响应时间。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!