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

适用于:Azure SQL 数据库

使用内存中 OLTP,内存优化表和表变量中的数据驻留在内存中 OLTP 存储中,这是为内存中数据预留的数据库内存的一部分。

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

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

估计内存优化表的内存要求,如同在 Azure SQL 数据库中估计 SQL Server 的内存要求一样。 请查看估算内存需求

表和表变量行以及索引都计入上限。 此外,ALTER TABLE 语句需要足够的内存来创建整个表及其索引的新版本。

一旦达到上限,插入和更新操作可能会开始失败。 此时,需要删除数据以回收内存,或者纵向扩展数据库或弹性池的服务目标。 有关详细信息,请参阅更正超过内存中 OLTP 存储的情况 - 错误 41823 和 41840

监视和警报

可以在 Azure 门户中,通过服务目标的存储上限百分比来监视内存中 OLTP 存储用量:

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

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

SELECT xtp_storage_percent 
FROM sys.dm_db_resource_stats
ORDER BY end_time DESC;

使用内存中 OLTP 解决内存不足错误

达到数据库或弹性池中的内存中 OLTP 存储上限可能会导致 INSERTUPDATEALTERCREATE 语句失败,并出现错误 41823(对于单个数据库)或错误 41840(对于弹性池)。 这两个错误均会导致活动的事务中止。

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

若要解决这些错误:

  • 从内存优化表中删除数据,为此,可以将数据卸载到传统的基于磁盘的表;或者,
  • 将服务目标升级为具有足够的内存中 OLTP 存储的服务目标,以便将数据保存在内存优化表和表变量中。

注意

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

使用 DMV 进行监视

  • 通过主动监视内存消耗,可以确定内存消耗的增长情况以及距离资源限制还有多少空余空间。 标识您的数据库或实例中对象所使用的内存量。 可以使用 sys.dm_db_xtp_table_memory_statssys.dm_os_memory_clerks DMV。

    • 您可以通过查询 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 引擎的所有内存。 使用以下查询来查找内存中 OLTP 引擎使用的所有内存,包括专用于特定数据库的内存。

      -- This DMV accounts for all memory used by the In-Memory OLTP 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;