SQL Server 2014 中的锁无关写操作

  • Jonathan Allen
  • 孙镜涛

2013 年 9 月 25 日

话题:架构

2012 年带有 2TB DRAM 的商业化双路服务器面世。有如此可观的内存可以使用,Microsoft 认为是时候认真考虑新的数据库机制将工作集完全放到内存中了。这种想法的结果便是 SQL Server 2014,它有一个新功能称之为“内存优化表(Memory Optimized Tables)”或者“内存 OLTP”。

内存优化表不仅仅是恰好适合在内存中使用的表。它是一种全新的存储和查询子系统,围绕着在任何时候都必须保留在内存中的表而设计。这样就能够做一些有趣的优化。

这种新的表类型所提供的一个优化是完全锁无关(Lock-Free)的写操作。Microsoft 的 Kalen Delaney 声称:

在访问内存优化表的时候,SQL Server 会使用完全乐观的多版本并发控制。尽管之前 SQL Server 被描述为使用 SQL Server 2005 中引入的基于快照的隔离级别支持乐观的并发控制,但是这些所谓的乐观方法在执行数据修改操作的时候确实会获取锁。而对于内存优化表而言,并不会获取锁,因此也不会有阻塞等待。

需要注意的是,“没有等待锁”和“没有等待”之间有一个区别。在写入事务日志的时候依然可能会产生等待。

内存优化表默认是持久的。尽管你可以关闭持久化选项,但是在正常的环境下你将会喜欢获得和传统的基于磁盘的表一样的 ACID 保证。除了标准的事务日志之外,还要创建一个单独的使用“CONTAINS MEMORY_OPTIMIZED_DATA”选项标记的文件组。

非持久或者“SCHEMA_ONLY”的表不仅仅是不持久化。这些表对任何 I/O 都是完全自由的。如果重启了服务器,那么所有的数据都会丢失。这让它成为了一个理想的候选方案,可以用于非规范化的数据缓存、瞬态使用的会话(例如来自于 ASP.NET 的会话)以及其他能够容易创建的数据。

内存优化表在涉及到数据类型的时候是受限制的。涉及到“在行外”储存数据的所有内容都会被禁止。包括二进制、xml、文本以及 varChar(max)这样的类型。所有的内容都必须符合在标准的行大小(8060 个字节)之内的限制。

另外,你不能使用 varChar 列作弊。行大小是根据可变长度列的最大大小计算的,不是像传统表那样使用最小值。但是至少在使用它的时候你不需要担心数据截断。

明天我们将会介绍内存优化表中的索引。

查看英文原文Lock-Free Writes in SQL Server 2014

架构