比较基于磁盘的表存储与内存优化的表存储

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

类别 基于磁盘的表 持久性内存优化表
DDL 元数据信息存储在数据库主文件组中的系统表中,可通过目录视图进行访问。 元数据信息存储在数据库主文件组中的系统表中,可通过目录视图进行访问。
结构 行存储在 8K 页中。 页中仅存储同一个表中的行。 行作为单独的行进行存储。 没有页结构。 数据文件中的两个连续行可以属于不同内存优化表。
索引 索引采用与数据行类似的页结构进行存储。 只有索引定义会被持久化(而不是索引行数据)。 索引维护在内存中,并会在数据库重启过程中内存优化表加载到内存时重新生成。 由于索引行不会被持久化,因此不会对索引更改进行日志记录。
DML 操作 第一步是查找页,然后将其加载到缓冲池中。

插入
SQL Server 会根据聚集索引的顺序将该行插入到页中。

删除
SQL Server 在页上找到要删除的行,然后将其标记为“已删除”。

更新
SQL Server 在页上查找行。 对于非键列,将会就地进行更新。 键列更新是通过删除和插入操作完成的。

DML 操作完成后,受影响的页会作为缓冲池策略、检查点或事务提交的一部分刷新到磁盘中,以实现具有最少记录的操作。 对页面的读写操作都会导致不必要的 I/O。
对于内存优化表,由于数据驻留在内存中,因此 DML 操作直接在内存中进行。 有一个后台线程会读取内存优化表的日志记录,并将其持久保存到数据文件和增量文件中。 一个更新会生成新的行版本。 但是,更新会被记录为先删除,后插入。
数据碎片化 数据操作会使数据产生碎片,从而导致未完全填满的页,以及逻辑上连续但在磁盘上并不连续的页。 这会降低数据访问的性能,需要对数据进行碎片整理。 内存优化数据不存储在页中,因此没有数据碎片。 但是,随着行被更新和删除,数据文件和增量文件需要进行压实。 这是由基于合并策略的后台 MERGE 线程完成的。

另请参阅

创建和管理用于内存优化对象的存储