中文

问题:使用 SQL Server 原生空间类型时,ArcGIS 客户端会遇到与表格方案变更、应用程序域卸载或获取缓冲区相关的错误

说明

编辑或显示使用 SQL Server 原生空间类型存储的空间数据时,ArcGIS 客户端应用程序可能会遇到以下错误:

错误:
无法完成游标操作,原因在于表格方案在游标声明后更改。
 
错误:
具有指定版本 ID (%d) 的应用程序域由于内存压力而卸载,因此无法找到。
 
错误:
[Microsoft][SQL Server Native Client 11.0][SQL Server]当前获取缓冲区中不存在任何行。

在 SQL Server 错误日志中,错误通常与强制公共语言运行库 (CLR) 应用程序域卸载的内存压力有关。

注:
默认情况下,错误日志位于以下文件夹位置: 
C:\Program Files\Microsoft SQL Server\MSSQL##.MSSQLSERVER\MSSQL\Log

原因

Microsoft SQL Server 空间类型严重依赖于 CLR。 卸载托管 CLR 数据的应用程序域时,这将视为对数据库引擎 的方案变更,并且在显示和编辑使用几何或地理类型存储的要素类时,可能会导致错误。

正如错误 所示,这是 SQL Server 内的内存问题,该问题可强制托管空间类型的 CLR 应用程序域卸载。

解决方案或解决方法

在较早版本的 SQL Server(SQL Server 2005、SQL Server 2008 和 SQL Server 2008 R2)中,缓冲池消耗的物理内存限制由最大服务器内存 (MB) 和最小服务器内存 (MB) 配置选项确定。 CLR 分配(包括 SQL CLR 堆及其在 CLR 初始化期间创建的全局分配)并非由这些配置选项确定。

自 SQL Server 2012 起,单页、多页和 CLR 分配被合并到“任意大小”页面分配器中,并且其包含在由最大服务器内存 (MB) 和最小服务器内存 (MB) 配置选项控制的内存限制中。 此项变更针对通 过 SQL Server Memory Manager 的所有内存要求提供了更加准确的大小调整功能。 如果 SQL Server Memory Manager 发现内存不足的情况,则可以从内存中启动卸载页面。 CLR 分配被视为具有较低的优先级,因此 更可能会被卸载。

在确定必须使用最大服务器内存 (MB) 和最小服务器内存 (MB) 配置选项分配多少内存时,这是非常有价值的信息。 默认情况下,最大服务器内存为 2147483647 MB 或者为服务器上的所有可用内存。 将最大服务器内存配置选项设置为限制 SQL Server 内存消耗的值,以允许其他进程(例如操作系统)使用足够的内存,这一点非常重要。 虽然看似并不直观,但减小 SQL Server 内存池允许其他进程或应用程序消耗所需内存,而不会影响分配给 SQL Server 的内存。 如果将服务器上的所有内存都分配给 SQL Server,则出现内存压力错误的可能性将更大。

  • 对于 SQL Server 2005、2008 和 2008 R2 版本,如果错误地将最大服务器内存设置得过高,则内存管理器可以查看并控制缓冲池使用的过多总服务器内存。 将通过剩余的可用内存来执行 CLR 分配,这会导致为 CLR 保留的内存过少。
  • 对于 SQL Server 2012 或更高版本,内存管理策略可能会有所不同。 由于 CLR 内存分配现在由服务器内存配置选项控制,因此可以将最大服务器内存设置为高于之前版本的 SQL Server 的值。
  • 自 SQL Server 2016 起,可以调用多种空间方法的原生实现,从而提高性能并进一步减少基于 CLR 的内存压力错误。
考虑除了 SQL Server 之外,系统上是否还运行其他应用程序或进程,以及服务器上实际可用的内存量。 服务器上可能未安装足够的内存来处理 SQL Server 操作以及操作系统所需的操作。 其他应用程序可能正在使用应该用于 SQL Server 的物理内存。 通常建议 SQL Server 应该位于其自己的专用服务器上。 其他竞争内存的应用程序(例如 ArcGIS)应该安装在不同的计算机上。

Microsoft 表示目前正在努力解决更普遍的 CLR 内存不足问题。 如果在 使用 ArcGIS 时遇到任何上述错误,或者在 SQL Server 错误日志中找到任何上述错误,建议您致电 Microsoft 支持以进一步调查错误的根本原因。

针对此问题致电 Microsoft 支持时,请向支持分析师提供事件 #114080611682006 和缺陷 #3374271。
 

知识库文章备注:
本文之前已记录为 KB 43036。