2025-11-10
SQLSERVER
00

目录

表结构与测试数据准备
Customers表结构:
Orders表结构:
生成测试数据:
创建索引
更新统计信息
重写查询

了解查询执行计划是优化SQL Server性能的关键。本文将通过一个实例,详细介绍如何创建和分析执行计划,以识别并解决性能瓶颈。我们将使用具体的测试数据和表结构,并提供相应的SQL脚本,以及具体的操作流程。

表结构与测试数据准备

假设我们有一个销售数据库SalesDB,其中包含两个表:CustomersOrders。以下是它们的结构和用于生成测试数据的脚本。

Customers表结构:

SQL
CREATE TABLE Customers ( CustomerID INT PRIMARY KEY, CustomerName NVARCHAR(100), Region NVARCHAR(50) );

Orders表结构:

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

生成测试数据:

SQL
-- 插入Customers数据 DECLARE @i INT = 1; WHILE @i <= 1000 BEGIN INSERT INTO Customers (CustomerID, CustomerName, Region) VALUES (@i, CONCAT('Customer ', @i), CASE WHEN @i % 2 = 0 THEN 'East' ELSE 'West' END); SET @i = @i + 1; END; -- 插入Orders数据 SET @i = 1; WHILE @i <= 100000 BEGIN INSERT INTO Orders (OrderID, CustomerID, OrderDate, TotalAmount) VALUES (@i, RAND()*(1000-1)+1, DATEADD(day, RAND()*(365-1), '2019-01-01'), RAND()*1000); SET @i = @i + 1; END;

image.png

获取查询执行计划

要分析查询性能,首先需要获取查询的执行计划。这可以在SQL Server Management Studio (SSMS)中通过以下步骤完成:

  1. 连接到SalesDB数据库。
  2. 在查询编辑器中输入查询。
  3. 点击工具栏上的“包含实际执行计划”按钮(或按Ctrl + M)。
  4. 执行查询。

查询示例

我们想要分析以下查询:

SQL
SELECT c.CustomerName, COUNT(o.OrderID) AS TotalOrders, SUM(o.TotalAmount) AS TotalAmount FROM Customers c JOIN Orders o ON c.CustomerID = o.CustomerID WHERE o.OrderDate BETWEEN '2019-01-01' AND '2019-12-31' GROUP BY c.CustomerName HAVING SUM(o.TotalAmount) > 1000;

image.png

分析查询执行计別

执行完查询后,执行计划将在SSMS的“执行计划”选项卡中显示。我们可能会看到以下几个关键操作:

  • Clustered Index Scan:这表明SQL Server需要扫描整个表来寻找符合条件的行。
  • Hash Match:这是一个连接操作,它将Customers表和Orders表的行匹配起来。
  • Stream Aggregate:用于执行分组和聚合操作,如COUNTSUM
  • Filter:应用HAVING子句的过滤条件。

image.png

关键指标分析

我们需要关注以下指标:

  • 操作符成本:表示每个操作符相对于整个查询的成本百分比。
  • 实际行数与估计行数:如果这两个数值相差很大,可能表明统计信息不准确。

优化查询

根据执行计划的分析,我们可以考虑以下优化措施:

创建索引

SQL
CREATE NONCLUSTERED INDEX idx_Orders_OrderDate_CustomerID ON Orders(OrderDate, CustomerID) INCLUDE (TotalAmount);

image.png

更新统计信息

SQL
UPDATE STATISTICS Customers; UPDATE STATISTICS Orders;

重写查询

在某些情况下,调整查询逻辑可能会提高性能,例如使用子查询或公共表表达式(CTE)。

结论

本文提供了一个关于如何创建和分析SQL Server查询执行计划的深入指南。通过实例数据、表结构和具体操作流程,我们演示了如何识别性能瓶颈并提出了相应的优化建议。掌握这些技能可以显著提高数据库查询的效率。

本文作者:技术老小子

本文链接:

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