症状
假设您具有许多统计信息和表,并且表在 Microsoft SQL Server 2012 或 SQL Server 2014 数据库中包含许多列。 执行多个临时查询以同时从这些表检索数据时,在执行过程中可能会遇到 CMEMTHREAD 等待。
解决方法
累积更新信息
此问题首先在以下SQL Server累积更新中得到解决。
建议:为SQL Server安装最新的累积更新
SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 建议下载并安装SQL Server的最新累积更新:
详细信息
在 2012 SQL Server 编译或重新编译查询时,引擎需要从统计信息直方图获取输入。 我们需要执行系统表扫描,然后将涉及的表的特定直方图加载到内存或缓存中。 这些系统表条目 (统计信息) 存储在系统表缓存 (CACHESTORE_SYSTEMROWSET) 中。 用于在缓存中创建这些条目的内存对象未分区,并且是全局的。
因此,如果在此操作期间执行了并发内存分配,将在此内存对象上遇到 CMEMTHREAD 等待。 提交大量需要编译或重新编译的查询时,通常会发生这种情况。
此修补程序更改要分区的全局内存对象,以便使用系统表缓存的并发内存分配不会遇到争用和 CMEMTHREAD 等待。
有关类似问题的详细信息,请参阅 KB 3026082:修复:SQL Server 2012 年或 2014 年,系统表行集缓存上的SOS_CACHESTORE自旋锁争用导致 CPU 使用率过高。
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。