如何回答为什么突然需要更改索引或查询

The*_*war 11 performance sql-server execution-plan

我是初级 DBA,有 3 年的经验。我们的工作是微调查询或建议开发人员应该重写特定代码或需要索引。

开发团队经常问的一个简单问题是:“昨天运行良好,突然发生了什么变化?” 我们将被要求检查基础设施方面。对任何问题的第一反应似乎总是将最大的责任归咎于基础设施,这始终是首先要验证的事情。

我们应该如何回答开发团队提出的“改变了什么”的问题?大家有遇到过同样的情况吗?如果是这样,请分享您的经验。

Kin*_*hah 10

如何回答 dev 改变了什么问题?

这不仅是 DEV 的一个非常常见的问题,它适用于 IT 和业务中的每个团队。

发生了什么变化?==> 可以用事实和数字来回答。

事实参考例如

  • 增加访问数据库的用户数量?
  • 服务器配置参数有什么变化吗?
  • 数据库维护 - 更新统计信息,未执行索引的重组/重建?因此,计划被错误地生成!
  • 数据量增加了吗?
  • 在网络方面进行了更改,修补了操作系统和/或部署了用于 sql server 的新服务包或 CU -没有对您的应用程序业务周期进行完整的回归测试
  • 底层的 SAN 突然变慢了?

如果您有要显示的数据,则可以得出数字。例如 :

  • 在这种情况下,为您的服务器设置基线至关重要。这将减轻责备游戏,因为您可以用可靠的数字来支持事实。
  • 开始使用 DMV 或 sp_whoisactive 将数据收集到表中,以便在 sql server 重新启动后保留数据。

(您必须根据您的环境和需求、收集数据的频率/收集的数据以及保留期的长度进行锻炼(您可以投资第三方软件,如 sqlsentry 或 idera 的诊断管理器)将为您完成上述工作)


Aar*_*and 7

好吧,您可能会获得不同的计划,因为:

  • 由于以下原因,该计划可能已被逐出缓存:
    • 服务重启
    • 手动清除计划缓存
    • 服务重启或故障转移
    • 无意的更改,例如某些sp_configure更改可以刷新缓存
    • 对底层对象、索引、统计数据或其他依赖项的某些更改触发了重新编译
  • 您可能会获得与其他用户或以前调用不同的计划,因为:
    • 查询文本可能不相同(这包括区分大小写和空格,不要介意不同的列、连接条件、过滤器等)
    • 查询可以由具有不同设置选项(或不同默认模式,如果计划中的任何对象没有完全限定名称,包括模式)的不同用户运行
  • 查询和计划可能相同,但您可能会获得不同的性能,因为:
    • 该计划使用不同的参数缓存,并且该计划对于当前的参数集不是最佳的(这通常称为“参数嗅探”)
    • 数据量基于参数或仅因数据变化而有显着差异
    • 数据已经改变到足以改变访问数据的最有效方式,但不足以触发统计更新或重新编译(搜索升序关键问题以及自动统计算法)
    • 数据已从缓冲池中逐出,现在必须从磁盘读取
    • 满足查询所需的资源具有更高的并发性、阻塞性或其他压力

我在这里更详细地介绍了很多这些:

如果这些在不同的环境中运行,那么我有一系列的事情要在这里检查:

此外,重要的是要记住,创建索引或更改查询可能不是查询突然表现更好的直接原因 - 有时只是因为这些更改确实生成了一个新计划和/或使已经存在的计划无效.


Eri*_*rik 7

像往常一样,Aaron BertrandKin提供了很好的答案。然而,这两个答案都包含一个共同点。如果您分析任何一个答案,您就会发现 XYZ 没有像昨天那样工作的原因不是因为您/他们/人 X 做了什么。事情发生变化的原因是由于 XYZ 的原因,数据库决定以不同的方式做事。

数据库是一个活生生的、会呼吸的实体。数据库将做出决定,并由于假设、统计和其他启发式工具的组合而改变主意。这与大多数应用层编程有很大不同(机器学习是一个明显的例外)。

我将使用一些军事参考,因为我现在想不出更好的东西。一个更一般的比喻将不胜感激(没有双关语意)。

在大多数应用程序中,程序员充当演练指导员。它们会准确地告诉计算机要做什么,以什么顺序,有时还有多长时间。对数据库进行编程更像是充当指挥官。你告诉它你希望它在高层次上做什么,并在需要时提供一些指导。该数据库的任务是根据初级军官和士官等当前情报,找出执行计划的最佳方式。

通过在其他程序员的脑海中明确区分这一点,他们有望开始看到您没有像他们那样对环境拥有独裁权力。您正在引导数据库找到解决方案,但有时数据库会因为好的或坏的原因而偏离轨道。提醒他们,最终数据库为什么偏离轨道并不重要,重要的是我们可以做些什么来恢复它。

*我认识到“为什么”对于未来的预防、学习等非常有价值,但似乎 OP 正面临着那些不想了解或帮助问题的人的阻力。