当前位置: 首页 > news >正文

如何通过执行计划分析优化SQL查询性能——以`TrainOrderChange`表查询为例

SQL 查询优化是数据库性能优化中的重要环节,而执行计划则是分析和优化查询的核心工具之一。在本文中,我们将通过一个具体的 SQL 查询执行计划,展示如何识别和解决常见的性能问题,提升数据库查询效率。


案例分析:TrainOrderChange 表查询

这是我们在优化前的查询语句:

SELECTTOC.*
FROMxxx_Train.[dbo].[TrainOrderChange] AS TOC WITH (NOLOCK)
WHERETOC.[IsValid] = 1AND TOC.IsProcess = 0AND TOC.ChangeStatus = 1AND EXISTS(SELECT*FROMxxx_Train.[dbo].[TrainOrder] TOR WITH (NOLOCK)WHEREEnvType = '1'AND TOR.IsTest = 0AND TOR.SupplierType > 0AND TOC.OrderSerialNo = TOR.OrderSerialNoAND TOR.SupplierType = 12);

在这里插入图片描述

执行计划显示了以下几个主要问题:

  1. Clustered Index Scan:在 TrainOrderChange 表上进行了聚集索引扫描,表明在过滤条件列上缺乏合适的非聚集索引。
  2. Index Seek:在 TrainOrder 表上进行了索引查找,这部分性能相对较好,说明该表的部分索引满足了查询需求。
  3. Key Lookup:在 TrainOrder 表中存在回表操作,意味着当前索引未覆盖查询所需的所有字段,导致了额外的聚集索引查找。

优化思路

基于执行计划的分析结果,我们提出以下优化措施:

  1. TrainOrderChange 表创建合适的非聚集索引

    • 由于查询条件中使用了 IsValidIsProcessChangeStatusOrderSerialNo 列,因此建议在这些字段上创建一个复合索引,进一步提高查询效率,避免全表扫描。
  2. 优化 TrainOrder 表中的 Key Lookup

    • Key Lookup 操作会引发回表,增加查询的 I/O 消耗。我们可以通过将查询中涉及的字段添加到索引的 INCLUDE 子句中,以覆盖所需字段,避免不必要的回表操作。
  3. 确保统计信息是最新的

    • 确保相关表的统计信息是最新的,有助于数据库优化器选择最优的查询执行计划。可以通过 UPDATE STATISTICS 来更新统计信息,提升优化器的准确性。

优化实现

1. 为 TrainOrderChange 表创建复合索引

TrainOrderChange 表中,查询条件使用了 IsValidIsProcessChangeStatus 列。我们可以创建一个复合索引,将这些列作为索引键,OrderSerialNo 列作为包含列,以加速查询:

CREATE NONCLUSTERED INDEX IDX_TrainOrderChange_IsValid_IsProcess_ChangeStatus
ON [xx_Train].[dbo].[TrainOrderChange] ([IsValid], [IsProcess], [ChangeStatus])
INCLUDE ([OrderSerialNo]);

该索引可以使查询中的 WHERE 条件得到加速,同时通过包含 OrderSerialNo 列,避免在子查询连接时发生回表操作。

2. 优化 TrainOrder 表中的索引

为了减少 Key Lookup,我们可以在 TrainOrder 表上创建一个复合索引,将 OrderSerialNoEnvTypeIsTest 作为键列,同时将 SupplierType 列作为包含列,避免不必要的回表操作。

CREATE NONCLUSTERED INDEX IDX_TrainOrder_OrderSerialNo_EnvType_IsTest
ON [xx_Train].[dbo].[TrainOrder] ([OrderSerialNo], [EnvType], [IsTest])
INCLUDE ([SupplierType]);

这将确保查询可以直接从索引中提取 SupplierType,避免 Key Lookup 操作,进一步提升性能。

3. 更新统计信息

如果表的数据更新频繁,我们还需确保统计信息是最新的,可以使用以下命令来更新表的统计信息:

UPDATE STATISTICS [xxx_Train].[dbo].[TrainOrderChange];
UPDATE STATISTICS [xxx_Train].[dbo].[TrainOrder];

更新统计信息可以帮助优化器更准确地选择执行计划,尤其是在数据变化频繁的情况下,这一步尤为重要。

优化后的查询和执行计划

应用以上索引和统计信息更新后,执行查询,再次查看执行计划,我们预期看到以下改进:

  1. Clustered Index Scan 变为 Index Seek:新创建的非聚集索引应当使 TrainOrderChange 表的扫描变为索引查找,从而避免全表扫描。
  2. 消除 Key Lookup:新的索引设计和包含列应该避免在 TrainOrder 表上进行 Key Lookup 操作,从而减少回表,提高查询性能。

总结

在 SQL 查询优化中,通过分析执行计划,找出潜在的性能瓶颈是关键的一步。通过为查询频繁使用的字段创建合适的索引、覆盖查询所需的所有列、保持统计信息的最新,我们可以有效地提升查询性能。

执行计划的分析和优化是一个迭代的过程。每次调整后都要检查执行计划,以确保达到最佳的查询性能。希望本文的案例分析能够为你在实际工作中的 SQL 优化提供参考和帮助。


http://www.mrgr.cn/news/68356.html

相关文章:

  • macos中安装和设置ninja
  • 基于YOLO11/v10/v8/v5深度学习的维修工具检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
  • GAN的基本原理
  • 探讨集中式数据库优化策略
  • 初学Java基础Day22---枚举
  • 使用k8s RBAC和ValidatingAdmissionPolicy 配合来校验用户权限
  • UE5.4 PCG 复制关卡实例
  • go中的类型断言详解
  • 动态规划28:376. 摆动序列
  • 【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + HP60C上手体验
  • Linux系统的文件系统和日志和管理
  • 绿光激光头定制在各行业的应用优势
  • Java[面试题]-真实面试
  • 3235. 判断矩形的两个角落是否可达
  • 安装和卸载Mysql(压缩版)
  • Java——》try-with-resource
  • anaconda 安装笔记Ubuntu20
  • 强大又好用 这些AI工具让效率提升10倍
  • 【TS】九天学会TS语法——5.TypeScript的类
  • 气膜球幕:打造引人注目的展览新选择—轻空间
  • InsectaIntel 智能昆虫识别平台
  • 无人机影像处理系统技术选型
  • 【数据集】【YOLO】【目标检测】摔跤识别数据集 5097 张,YOLO行人摔倒识别算法实战训练教程!
  • node-sass下载报错解决方案
  • Java语法糖,你用过哪些?
  • 深入学习指针(5)!!!!!!!!!!!!!!!