监视 Azure SQL 数据库中的内存中 OLTP 存储

适用于:Azure SQL 数据库

通过内存中 OLTP,内存优化表中的数据和表变量驻留在内存中 OLTP 存储内。

确定数据是否在内存中 OLTP 存储容量限制范围内

确定不同服务层级的存储上限。 每个“高级”和“业务关键”服务层级都具有最大内存中 OLTP 存储大小。

估计内存优化表的内存要求,如同在 Azure SQL 数据库中估计 SQL Server 的内存要求一样。 需要几分钟时间来查看估计内存要求

表和表变量行以及索引都将计入最大用户数据大小。 此外,ALTER TABLE 需要足够的空间来创建新版的完整表及其索引。

一旦超过此限制,插入和更新操作可能会开始失败。 到时,需要删除数据以回收内存,或升级数据库的服务层级或计算大小。 有关详细信息,请参阅更正超过内存中 OLTP 存储的情况 - 错误 41823 和 41840

监视和警报

可以在 Azure 门户中,通过计算大小的存储上限百分比来监视内存中存储用量:

  1. SQL 数据库的“概述”页上,选择“监视”页中的图表。 或者,在导航菜单中找到“监视”,然后选择“指标”。
  2. 选择“添加指标”。
  3. 在“基本”下,选择指标内存中 OLTP 存储百分比
  4. 若要添加警报,请选择“资源利用率”框以打开“指标”页,然后选择“新建警报规则”。 按照说明创建指标警报规则

或者,使用以下查询来显示内存中存储的使用率:

SELECT xtp_storage_percent FROM sys.dm_db_resource_stats;

更正内存耗尽 OLTP 存储的情况 - 错误 41823 和 41840

数据库达到内存中 OLTP 存储上限会导致 INSERT、UPDATE、ALTER 和 CREATE 操作失败,出现错误 41823(针对单一数据库)或错误 41840(针对弹性池)。 这两个错误均会导致活动的事务中止。

错误 41823 和 41840 指示数据库或池中的内存优化表和表变量已达到最大的内存中 OLTP 存储大小。

若要解决此错误,请执行以下操作之一:

  • 从内存优化表中删除数据,为此,可以将数据卸载到传统的基于磁盘的表;或者,
  • 将服务层级升级到具有足够内存中存储的服务层级,使保存需要保留在内存优化表中的数据。

注意

在极少数情况下,错误 41823 和 41840 可能是暂时的,即有足够的可用内存中 OLTP 存储,重试后该操作成功。 因此,我们建议既要监视总体的可用内存中 OLTP 存储,又要在首次遇到错误 41823 或 41840 时重试。 有关重试逻辑的详细信息,请参阅内存中 OLTP 的冲突检测和重试逻辑

使用 DMV 进行监视

  • 通过定期监视内存消耗,可以确定内存消耗量的增长方式以及资源限制中留下的头空间量。 标识您的数据库或实例中对象所使用的内存量。 例如,DMV sys.dm_db_xtp_table_memory_statssys.dm_os_memory_clerks

    • 您可以通过查询 sys.dm_db_xtp_table_memory_stats,查找所有用户表、索引和系统对象的内存使用情况:

      SELECT object_name(object_id) AS [Name], *  
         FROM sys.dm_db_xtp_table_memory_stats;
      
    • 管理分配给内存中 OLTP 引擎和内存优化对象的内存的方式与管理数据库中任何其他内存消耗者的方式完全相同。 MEMORYCLERK_XTP 类型的内存分配器计算分配给内存中 OLTP 引擎的所有内存。 对 sys.dm_os_memory_clerks 使用以下查询查找内存中 OLTP 引擎使用的所有内存,包括专用于特定数据库的内存。

      -- This DMV accounts for all memory used by the in-memory engine  
      SELECT [type], [name]
           , memory_node_id  
           , pages_kb/1024 AS pages_MB   
      FROM sys.dm_os_memory_clerks 
      WHERE [type] LIKE '%xtp%';
      
      type                 name       memory_node_id pages_MB  
      -------------------- ---------- -------------- --------------------  
      MEMORYCLERK_XTP      Default    0              18  
      MEMORYCLERK_XTP      DB_ID_5    0              1358  
      MEMORYCLERK_XTP      Default    64             0  
      
    
    
  • 还可以使用动态管理视图 sys.dm_os_out_of_memory_events 获取有关Azure SQL 数据库内存不足错误的详细信息。 例如:

    SELECT * FROM sys.dm_os_out_of_memory_events ORDER BY event_time DESC;