MSSQLSERVER_8645

适用范围:SQL Server

详细信息

Attribute
产品名称 SQL Server
事件 ID 8645
事件来源 MSSQLSERVER
组件 SQLEngine
符号名称 MEMTIMEDOUT_ERR
消息正文 等待资源池 '%ls' (%ld)中的内存资源来执行该查询时发生超时。 请重新运行查询。

说明

如果 SQL Server 请求等待查询执行(QE)内存长时间且内存不可用,则会引发此错误。 查询执行内存主要用于排序操作、哈希操作、大容量复制操作以及索引创建和填充。 执行其中一项操作的查询请求内存授予。 如果没有可用内存,查询将设置为等待 RESOURCE_SEMAPHORE ,直到内存可用。 如果内存在等待超过 20 分钟后不可用,则 SQL Server 将终止查询,出现错误 8645“等待内存资源在资源池”default“中执行查询时出现超时。 超时值在 SQL Server 版本之间略有不同。 可以通过查看timeout_secsys.dm_exec_query_memory_grants来查看服务器级别设置的超时值。

原因

与内存授予和长时间等待该内存可用有关,可以看到此错误。 通常,当查询完成时,它会释放它使用的执行内存。 因此,如果看到此错误,则表示超时查询已等待一些其他请求超过 20 分钟才能完成其工作。 可能只有一个请求消耗了所有可用的 QE 内存,也可能有许多请求,并且它们的内存授予一起耗尽了 QE 内存。 如果在工作负荷中运行了这么长时间的请求,则必须采取措施来改善其执行持续时间并降低其使用的 QE 内存量。

用户操作

如果不使用资源调控器来限制某些工作负荷的内存池,则可以验证服务器状态和工作负荷的总体状态。 如果使用资源调控器,请检查资源池或工作负荷组设置。

SQL Server 中内存授予导致的性能缓慢或内存不足问题疑难解答中介绍了详细说明和故障排除步骤。

以下列表总结了上述文章中详述的步骤。 这些步骤有助于减少或消除 QE 内存错误:

  1. 确定 SQL Server 中的哪些请求是大型内存授予或 QE 内存使用者。 有关详细信息,请参阅 如何确定查询执行内存的等待。

  2. 重写查询以最大程度地减少或避免排序和哈希操作。

  3. 更新统计信息并定期更新统计信息,以确保 SQL Server 正确估计内存授予。

  4. 为标识的查询或查询创建适当的索引。 索引可能会减少处理的大量行,从而更改 JOIN 算法并减小授予大小或完全消除它们。

  5. 尽可能在查询中使用 OPTION (min_grant_percent = XX, max_grant_percent = XX) 提示。

  6. 使用资源调控器将 QE 内存使用量的影响限制为特定的工作负荷。

  7. SQL Server 2017 和 2019 使用自适应查询处理,允许内存授予反馈机制在运行时动态调整内存授予大小。 此功能可能首先阻止内存授予问题。

  8. 增加 SQL Server 内存或调整现有设置。

    1. 检查以下 SQL Server 内存配置参数:

      • 最大服务器内存 - 根据需要增加
      • min server memory
      • min memory per query
    2. 注意不正常的设置。 根据需要更正它们。 考虑到 SQL Server 的内存需求增加。 “服务器内存配置”选项中列出了默认设置和建议的设置。

  9. 在 OS 级别(物理或虚拟 RAM)增加内存。

  10. 验证其他应用程序或服务是否占用此服务器上的内存。 重新配置不太关键的应用程序或服务以消耗更少的内存或将其移动到单独的服务器。 此操作可以消除外部内存压力。

  11. 运行以下 DBCC 命令以释放多个 SQL Server 内存缓存 - 临时度量值。

  • DBCC FREESYSTEMCACHE
  • DBCC FREESESSIONCACHE
  • DBCC FREEPROCCACHE