MSSQLSERVER_8645

适用于:SQL Server

详细信息

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

说明

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

原因

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

用户操作

如果未使用 Resource Governor 来限制某些工作负荷的内存池,则可以验证整体服务器状态和工作负载。 如果使用 Resource Governor 检查资源池或工作负荷组设置。

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

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

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

  2. 重写查询以最小化或避免排序和哈希操作。

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

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

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

  6. 使用 Resource Governor 将 QE 内存使用的影响限制为仅适用于特定工作负荷。

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

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

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

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

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

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

  11. 运行以下 DBCC 命令以释放多个SQL Server内存缓存 - 这是一种临时措施。

  • DBCC FREESYSTEMCACHE
  • DBCC FREESESSIONCACHE
  • DBCC FREEPROCCACHE