为什么我的查询在环境 A 中运行得很快,而在环境 B 中却很慢?

Low*_*n M 7 performance sql-server execution-plan query-performance

我有一段 SQL 似乎在环境 A 中运行得非常快,但完全相同的查询在环境 B 中运行得非常慢!

环境应该是相同的,所以我应该做什么和/或我应该在哪里查看查询为什么不执行相同?

Low*_*n M 13

SQL Server 内部和外部的许多因素都可能导致同一查询在不同环境中的执行情况不同,即使它们的配置接近完全相同,其中任何一个因素都可能导致非常不同的查询计划和性能。

服务器

  • 跨环境的硬件是否相同(磁盘、内存、CPU 等)?
    • 如果使用 VM,嘈杂的邻居是否会影响 VM 的整体性能?
    • 如果在云中,自动缩放和其他配置是否具有同等性?
  • 环境是否在物理/虚拟/云之间混合?
  • 操作系统版本是否匹配?
  • 环境是否位于不同的数据中心?

实例

  • SQL Server 版本是否相同?
    • 即使主要版本相同,CU 或 SP 也可以带来不同的世界。
  • 查询执行期间的活动工作负载是否具有可比性?
    • 所有环境中是否存在相同数量的查询?
    • 所有环境中工作负载的性质是否相同?
  • 是否所有环境都参与相同的 HA/DR 设置?
    • 很多时候,较低的环境没有可用性组、日志传送或复制设置,而生产/灾难恢复可能正在使用这些技术。
  • 是否在所有环境中都按照相同的计划运行相同的维护作业?
  • 跟踪标志在所有环境中是否相同?
  • 是否在所有环境中运行相同的备份作业?
    • 备份的影响应该很小,但通常它们根本不会在较低的环境中运行。
  • sys配置是否相同?

数据库

  • 架构/索引/统计信息/对象在不同环境中是否完全相同?
  • 跨环境是否存在完全相同的数据?
    • 数据量
    • 数据分布
    • 数据大小(想想可变长度数据类型中的虚拟数据,可能无法反映其他环境中实际值的大小)
  • 数据库级别的配置是否相同?
  • 兼容性级别是否相同?

考虑到所有这些,在许多情况下根本不可能在不同环境中完美复制数据库的每个方面也就不足为奇了。虽然测试可以很好地确定查询在每个环境中的执行情况,但如果环境之间存在差异也就不足为奇了。在开发新查询时,通常需要在它转向生产时进行额外的调整。

通常,在一个环境中调优较慢的查询不应导致生成的执行计划出现回归,因此这是一个调整索引、统计信息或查询本身以实现整体改进的机会。

最后一点:较低的环境规模不足,通常不应期望提供与生产或预生产环境相同的性能。

更多资源:


小智 9

其他答案很好,但我想补充一点,您应该考虑环境 B 中的数据量,以及与其他查询的任何争用。

一些 SQL 查询单独显示没有性能问题(例如表中有 1000 行,没有其他查询正在运行),但表中有 10,000,000 行可能会令人恐惧地显示(例如参数嗅探问题),和/或其他可能写入、更新的查询或锁定所涉及的表。

我同意首先检查硬件/环境/配置匹配的其他答案,但如果没有明显的问题出现,请开始查看查询执行计划、运行 SQL Profiler 等。