我有一个 SQL Server 2016 SP1 生产服务器。它已经运行了 330 天而没有重新启动。一切都运行良好。直到上周的一天,突然之间,服务器上的每个查询都生成了一个编译。
通常当我检查 Perfmon 时,我看到很多 Batch Requests/Sec 但今天,我看到的 Requests/Sec 和 Compilations/Sec 一样多
当我试图查看什么正在使用我的缓存时,我一无所获!我从来没有见过这样的事情。它持续了一整天,CPU 一直处于 100%,因为它一直在编译。
最后,IT 决定重启机器。重启后一切都得到修复。但我想知道,你见过这样的事情吗?缓存计划会被破坏吗?(比如,如果我运行了 DBCC FREEPROCCACHE,它可能会在不重新启动的情况下自行修复?)
这是否意味着我应该至少每六个月左右重新启动一次服务器?
您应该启用内存中的锁定页面(LPIM)。
在 SQL Server 2016+ 上,我遇到了类似的情况,我认为这是一个错误。当服务器遇到内存压力并且未启用 LPIM 时,SQL Server 将清除计划缓存作为将内存释放回操作系统的过程的一部分。这很正常。SQL Server 应该只在内存不足的情况下执行此操作。
在某些情况下,SQL Server 将继续清除计划缓存,即使在解决内存不足的情况后也是如此。这会导致您看到的行为。在繁忙的服务器上,您会看到一些计划进入计划缓存,几秒钟后才被清除。这不是正确的行为。
启用 LPIM 将解决该问题。启用 LPIM 是所有 SQL Server 安装的最佳实践,因此我建议为每个 SQL Server 实例启用它,无论版本如何或您是否遇到过此问题。
启用内存中的锁定页面选项