适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
| 类别 | 基于磁盘的表 | 持久性内存优化表 |
|---|---|---|
| DDL | 元数据信息存储在数据库主文件组中的系统表中,可通过目录视图进行访问。 | 元数据信息存储在数据库主文件组中的系统表中,可通过目录视图进行访问。 |
| 结构 | 行存储在 8K 页中。 页中仅存储同一个表中的行。 | 行作为单独的行进行存储。 没有页结构。 数据文件中的两个连续行可以属于不同内存优化表。 |
| 索引 | 索引采用与数据行类似的页结构进行存储。 | 只有索引定义会被持久化(而不是索引行数据)。 索引维护在内存中,并会在数据库重启过程中内存优化表加载到内存时重新生成。 由于索引行不会被持久化,因此不会对索引更改进行日志记录。 |
| DML 操作 | 第一步是查找页,然后将其加载到缓冲池中。 插入 SQL Server 会根据聚集索引的顺序将该行插入到页中。 删除 SQL Server 在页上找到要删除的行,然后将其标记为“已删除”。 更新 SQL Server 在页上查找行。 对于非键列,将会就地进行更新。 键列更新是通过删除和插入操作完成的。 DML 操作完成后,受影响的页会作为缓冲池策略、检查点或事务提交的一部分刷新到磁盘中,以实现具有最少记录的操作。 对页面的读写操作都会导致不必要的 I/O。 |
对于内存优化表,由于数据驻留在内存中,因此 DML 操作直接在内存中进行。 有一个后台线程会读取内存优化表的日志记录,并将其持久保存到数据文件和增量文件中。 一个更新会生成新的行版本。 但是,更新会被记录为先删除,后插入。 |
| 数据碎片化 | 数据操作会使数据产生碎片,从而导致未完全填满的页,以及逻辑上连续但在磁盘上并不连续的页。 这会降低数据访问的性能,需要对数据进行碎片整理。 | 内存优化数据不存储在页中,因此没有数据碎片。 但是,随着行被更新和删除,数据文件和增量文件需要进行压实。 这是由基于合并策略的后台 MERGE 线程完成的。 |