更改为兼容级别 150 会使 SQL Server 消耗所有可用内存

Lui*_*reu 4 sql-server memory functions compatibility-level sql-server-2019

我们正在将现有数据库移动到新的 SQL Server 2019 实例。

如果我们将兼容级别更改为 150,则没有任何效果。任务管理器显示 sql server 服务正在消耗所有可用内存并且所有查询超时并显示错误

内部资源池中的系统内存不足,无法运行此查询

RAM 被完全消耗,直到无法运行查询(所有这些都以我提到的上一个错误结束)。我们尝试过 16、32 和 64GB 的 RAM。

任何人都可以提供有关如何调试的任何提示吗?

请注意,这不是查询问题……仅更改兼容级别就足以使 SQL 开始耗尽内存。

即使运行一个简单的标量函数(内部使用多个 Substring 和 cast 调用 - 没有表或视图选择)也足以使其消耗所有可用内存。

Jos*_*ell 10

您遇到了标量 UDF 内联的已知错误。您可以使用此处的其中一种方法禁用内联(或使用较低的兼容级别,正如您自己发现的那样):

在不更改兼容性级别的情况下禁用标量 UDF 内联

或者安装 CU2 进行永久修复。


...即使运行一个简单的标量函数(内部使用多个 Substring 和 cast 调用 - 没有表或视图选择)也足以使其消耗所有可用内存......

阅读您问题的这一部分让我想起了来自 sqL_handLe 的这篇非常有趣的博客文章:

SQL Server 2019 标量 UDF 内联 - 在某些情况下 OOM

他演示了一个不进行任何数据访问的标量 UDF,但会耗尽盒子上的所有内存(即使是一个几乎有 1 TB RAM 的内存):

不只是自己崩溃。使试图分配内存的实例上的任何其他查询崩溃(例如,针对查询内存授权进行窃取)。

这应该在SQL Server 2019 CU2 中修复,看起来这是它的知识库:

修复:SQL Server 2019 中的标量 UDF 内联问题

对于使用标量 UDF 内联的查询可能返回错误或意外结果的情况,此累积更新包括以下领域的多项修复:

  • ...
  • 由于非常大的标量 UDF 导致内存不足和内存泄漏
  • ...

如果由于某种原因无法安装 CU2,只要在数据库级别禁用标量 UDF 内联,就可以使用较新的兼容级别,如下所示:

ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;
Run Code Online (Sandbox Code Playgroud)

或者在查询级别,如我之前链接的文档文章中所述。