内存优化表是SQL server2014版本中推出的新特性之一。也是基于create table创建的,只不过是驻留在内存中表。从内存读取表中的行和将这些行写入内存。 整个表都驻留在内存中。表数据的另一个副本维护在磁盘上,但仅用于持续性目的。内存中 OLTP 与 SQL Server 集成,以便在所有方面(如开发、部署、可管理性和可支持性)提供无缝体验。 内存优化表中的行是版本化的。 这意味着表中的每行都可能有多个版本。 所有行版本均维护在同一个表数据结构中。 本文主要描述SQL server 2014内存表的相关特性。
一、基本特性
是一张持续驻留在内存中的表。
使用基于行版本化特性(等同于Oracle MVCC),需要维护每一个行的多个不同版本。
行版本控制用于实现对同一行的并发读取和写入,注意此处是并发。
如表tb1有三行:r1、r2 和 r3。 r1 有三个版本,r2 有两个版本,r3 有四个版本。
同一行的不同版本不必占用连续的内存位置。 不同的行版本可分散到整个表数据结构中。
二、持久化特性
支持事务(ACID)原则的完全持久化表,因为磁盘上会有相应的副本。
使用延迟事务提交写入磁盘。缺点是丢失已提交但未保存到磁盘的事务。
非持久的内存优化表,不记录这些表的日志且不在磁盘上保存它们的数据。掉电丢失,等同mysql memory引擎。
三、性能与可伸缩
使用本机编译的存储过程获得最佳性能,解释性TSQL一般。
对于基于复杂存储过程实现逻辑,且应用较少调用的的场景,表现优异。
内存表哈希索引高于非聚集索引,内存表非聚集索引性能高于磁盘表非聚集索引。
解决了IO瓶颈,缺点是需要增大内存开销。
避免了闩锁与旋转锁争用。
基于乐观并发控制形式来实现所有事务隔离级别,解决了读阻塞写的问题。Oracle是用MVCC及undo来搞定。
四、内存表图示描述
下图为内存表调用方式描述图
下图为本文草画的流程图