内存优化型文件组

适用于:SQL Server

若要创建内存优化表,必须首先创建内存优化的文件组。 内存优化的文件组容纳一个或多个容器。 每个容器都包含数据文件、增量文件,或两者都有。

即使 SCHEMA_ONLY 表中的数据行不会持久化,并且内存优化表和本机编译存储过程的元数据存储在传统目录中,In-Memory OLTP 引擎仍然需要为 SCHEMA_ONLY 内存优化表配置内存优化文件组,以便为包含内存优化表的数据库提供一致的体验。

内存优化的文件组基于文件流文件组,具有以下差异:

  • 只能为每个数据库创建一个内存优化的文件组。 你需要显式将文件组标记为包含 memory_optimized_data。 可以在创建数据库时创建文件组,也可以稍后添加文件组:

    ALTER DATABASE imoltp ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA  
    
  • 需要将一个或多个容器添加到 MEMORY_OPTIMIZED_DATA 文件组。 例如:

    ALTER DATABASE imoltp ADD FILE (name='imoltp_mod1', filename='c:\data\imoltp_mod1') TO FILEGROUP imoltp_mod  
    
  • 你无需启用文件流(启用和配置 FILESTREAM)来创建内存优化文件组。 通过内存中 OLTP 引擎完成对文件流的映射。

  • 可以将新容器添加到内存优化的文件组。 您可能需要一个新的容器,以扩展持久型内存优化表所需的存储空间,并将 I/O 分布到多个容器中。

  • 在 Always On 可用性组配置中,内存优化文件组的数据移动得到了优化。 与发送到次要副本的 FILESTREAM 文件不同,内存优化文件组内的检查点文件(包括数据和增量文件)不会发送到次要副本。 数据和增量文件是使用次要副本上的事务日志构建的。

注意

在 SQL Server 2022(16.x)和更早版本中,使用内存优化文件组后, 只能通过删除数据库将其删除。 不能删除非空容器,也不能删除最后一个剩余的容器,即使该容器为空。 你也不能将数据和增量文件对移动到内存优化文件组中的另一个容器。

从 SQL Server 2025(17.x)开始,可以删除最后一个剩余的容器并删除内存优化的文件组。 有关详细信息,请参阅 内存优化容器和文件组删除

配置内存优化文件组

请考虑在内存优化的文件组中创建多个容器,并在不同的驱动器上分配这些容器以实现更多带宽来将数据流式传输到内存中。

在多容器、多驱动器场景中,数据和增量文件以轮循方式分配到容器中。 第一个数据文件从第一个容器分配,增量文件从下一个容器分配,并且此分配模式重复。 如果你有奇数个驱动器,每个驱动器映射到一个容器,则此分配方案会将数据和增量文件均匀分布到各容器中。 但如果你有偶数个驱动器,每个驱动器映射到一个容器,则可能导致存储不平衡,数据文件映射到奇数驱动器,增量文件映射到偶数驱动器。 若要在恢复时获得平衡的 I/O 流量,可考虑将成对的数据文件和增量文件放在同一磁盘/存储设备上。

在配置存储时,您必须提供大小为持久内存优化表大小的四倍的可用磁盘空间。 还应确保 I/O 子系统支持工作负荷所需的 IOPS。 如果数据和增量文件对以给定的 IOPS 填充,则需要三倍于该 IOPS 来应对存储和合并操作。 可以通过将一个或多个容器添加到内存优化的文件组来增加存储容量和 IOPS。

注意

如果为内存优化文件组设置了 MAXSIZE 值,且检查点文件超过容器的最大大小,则数据库将变为 SUSPECT 状态。
在这种情况下,不要尝试将数据库切换为 OFFLINE 和 ONLINE 状态,否则会导致数据库保持在 RECOVERY_PENDING 状态。

另请参阅

创建和管理用于内存优化对象的存储
数据库文件和文件组
ALTER DATABASE 文件和文件组选项 (Transact-SQL)