BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

SQL Server 2014中的锁无关写操作

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 孙镜涛 关注 2 他的粉丝 发布于 2013年9月26日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT