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 内联的已知错误。您可以使用此处的其中一种方法禁用内联(或使用较低的兼容级别,正如您自己发现的那样):
或者安装 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)
或者在查询级别,如我之前链接的文档文章中所述。
归档时间: |
|
查看次数: |
884 次 |
最近记录: |