SQL Server 每天重新创建计划

pet*_*rov 14 sql-server-2008 sql-server statistics execution-plan

我们的生产环境有这个问题。

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) - Windows NT 6.1(内部版本 7601:Service Pack 1)上的企业版(64 位)。

SQL Server 正在删除所有(几乎 100%)旧的执行计划,并在每天夜间(从晚上 11:00 到早上 8:00)重新创建它们。当“自动更新统计信息”处于禁用状态时,甚至会发生这种情况。在过去的 2-3 周内,我们已经开启了“自动更新统计信息”。但它仍在发生。

我们真的不知道是什么触发了这种重新生成计划,但我们确信我们不会手动进行。

唯一真正与计划重新生成时间一致的是我们的数据库维护工作:每日索引重组(碎片为 5-30% 时),以及每日索引重建(碎片超过 30% 时) ) 工作。通常这个日常维护工作只做重组(因为每天的索引碎片永远不会超过 30%)。

影响:

这些新创建的计划使一些 UDF 调用/查询调用(从 UI/网页调用)花费更长的时间(分钟而不是不到 1 秒),因此会话只会堆积起来,使 CPU 接近 90% .

当那些卡住的会话被强行删除(在 DB 端)时,问题就会消失,并且 1)当所有相应的执行计划被手动清除(对于查询)或 2)当 UDF 被更改(对于函数)时。从那一刻起,SQL 服务器创建的任何新计划都会在一天中完美运行,直到第二天早上最终出现相同的问题。此外,这种行为并不是 100% 一致的,我们并不是每天早上都能看到它。但是有一段时间我们已经连续 4-5 天看到它了。

问题发生在工作日的早晨,这似乎是更频繁地访问 UI/网页的时候。

有没有人知道是什么导致了这个问题以及如何解决这个问题?任何帮助将非常感激。

Ion*_*nic 2

嗯,我有一些可能导致这种行为的想法。

  1. 您监控您的内存压力吗?也许您的查询提出了一定的限制,这将导致计划缓存的刷新。我不知道您的应用程序,但这与您前端服务器的日志相符吗?这段时间也有压力吗?
  2. 您是否有专用的 SQL Server 或者该服务器是否与其他进程/服务共享其硬件?如果没有,请尝试考虑将 SQL Server 外包给专用计算机。这将减少其他服务的副作用。
  3. 您可能想要使用optimize for ad hoc workloads,它只会保存计划存根并在需要时编译它。这将减少计划缓存的负载,从而降低计划缓存刷新的机会。您可以使用启用它sp_configure 'optimize for ad hoc workloads',1; reconfigureadvanced options如果您启用了using ,则可以完成此操作sp_configure 'show advanced options',1; reconfigure
  4. 另一个想法可以是备份。只是简单的备份。如果它们很激进,您的机器也可能会受到压力。您提到的时间听起来像是计划备份的好时间跨度。
  5. 也许这只是维护脚本中的一个错误。您是否检查过是否存在逻辑问题导致您的脚本重建所有索引,而不仅仅是那些符合条件的索引。这也许也会导致它。

除了所有这些可能性之外,检查日志文件以了解 options 及其 x64 合作伙伴的某些更改可能很有affinity maskaffinity I/O mask。另一件事可能是更改MAXDOP实例的选项。请也检查它们的日志。他们也需要刷新计划缓存。

最后但并非最不重要的一点是,您仍然可以运行服务器端跟踪(只需使用探查器进行设置、启动它、停止它并使用 sql 命令在服务器端再次启动它)。除此之外perfmon就是你的朋友。它可以暂时观察和监控您的表现值。也许您可以看到压力与服务器上的某些操作的相似之处,这些操作可能会导致这些刷新。

希望这会对您有所帮助,即使答案会晚一些。