鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 软件教程 > 编程开发 > >

sqlserver2014内存数据库特性介绍

来源:互联网 作者:佚名 时间:2015-03-24 23:58
sql server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了,下面就简单介绍一下sql server 2014的内存数据库的一些特性

sql server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了,下面就简单介绍一下sql server 2014的内存数据库的一些特性

相信大家对内存数据库的概念并不陌生,之前也有多位大牛介绍过SQL内存数据库的创建方法,我曾仔细 拜读过,有了大致了解,不过仍有很多细节不清晰,比如:

(1)内存数据库是把整个数据库放到内存中的吗?

(2)数据都在内存里面,那宕机或者断电了,数据不是没有了吗?

(3)据在内存是怎么存放的,还是按照页的方式吗,一行的大小有限制吗?

(4)内存数据库号称无锁式设计,SQL是如何处理并发冲突的呢?

相信这些疑问也是大家在思考内存数据库时经常遇到的难题,下文将为大家一一揭开这些问题的面纱,如有不对之处,还请各位看官帮我指出。

一、内存数据库是如何存储的,只放在内存吗?是把整个数据库放在内存吗?

答案:不是。

sql server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了。去年我再西雅图参加SQL PASS Summit 2012的开幕式时,微软就宣布了将在下一个SQL Server版本中附带代号为Hekaton的内存数据库引擎。现在随着2014CTP1的到来,我们终于可以一窥其面貌。

内存数据库

在传统的数据库表中,由于磁盘的物理结构限制,表和索引的结构为B-Tree,这就使得该类索引在大并发的OLTP环境中显得非常乏力,虽然有很多办法来解决这类问题,比如说乐观并发控制,应用程序缓存,分布式等。但成本依然会略高。而随着这些年硬件的发展,现在服务器拥有几百G内存并不罕见,此外由于NUMA架构的成熟,也消除了多CPU访问内存的瓶颈问题,因此内存数据库得以出现。

内存的学名叫做Random Access Memory(RAM),因此如其特性一样,是随机访问的,因此对于内存,对应的数据结构也会是Hash-Index,而并发的隔离方式也对应的变成了MVCC,因此内存数据库可以在同样的硬件资源下,Handle更多的并发和请求,并且不会被锁阻塞,而SQL Server 2014集成了这个强大的功能,并不像Oracle的TimesTen需要额外付费,因此结合SSD AS Buffer Pool特性,所产生的效果将会非常值得期待。

SQL Server内存数据库的表现形式

在SQL Server的Hekaton引擎由两部分组成:内存优化表和本地编译存储过程。虽然Hekaton集成进了关系数据库引擎,但访问他们的方法对于客户端是透明的,这也意味着从客户端应用程序的角度来看,并不会知道Hekaton引擎的存在。如图1所示。

sqlserver2014内存数据库特性介绍

图1.客户端APP不会感知Hekaton引擎的存在

首先内存优化表完全不会再存在锁的概念(虽然之前的版本有快照隔离这个乐观并发控制的概念,但快照隔离仍然需要在修改数据的时候加锁),此外内存优化表Hash-Index结构使得随机读写的速度大大提高,另外内存优化表可以设置为非持久内存优化表,从而也就没有了日志(适合于ETL中间结果操作,但存在数据丢失的危险)

在这篇文章中,我想着重引用如下两个信息:

(1)内存数据库其实就是将指定的表放到内存中,而不是整个数据库;

(2)内存数据库用文件流的方式组织磁盘中的数据文件;

我再补充一个信息

(3)内存数据库的数据文件分data file和delta file,而且是成对出现;

1、内存数据库其实就是将指定的表放到内存中,而不是整个数据库;

内存数据库的创建过程其实就是将表存放到内存中,而不是整个数据库。下图展示 了创建内存优化表的语法,红色框标注了内存与传统表创建时语法不相同的地方。

sqlserver2014内存数据库特性介绍

内存优化表不仅仅是把数据存放到内存中,要不然跟传统数据的缓存没有区别。在内存数据库中,内存优化表也叫为" natively compile memory-optimized tables",翻译过来就是本地编译内存优化表,内存优化表在创建的同时被编译成本地机器代码装载到内存中,本地机器代码包含了能被CPU直接执行的机器指令,所以对内存优化表的访问和操作将非常快。

sqlserver2014内存数据库特性介绍

内存优化表分两类,持久性表和非持久性表,对持久性表的改动会记录日志,即使数据库重启,数据也不会丢失;对非持久性表的操作不会记录日志,这些操作结果只保留在内存中,数据库重启后数据会丢失。

上文只是介绍了新建一张表的情况,在正常的业务环境中我们不可能对一个业务系统数据库的每张表都去create,那对于已经存在的表,有没有配置方法呢?答案恐怕不太令人满意,目前SQL暂不支持迁移现有表到内存中,因此要想使用内存数据库,现有的业务数据表必须重新创建。

2、内存数据库用文件流的方式组织磁盘中的数据文件

在内存数据库中,磁盘上存储的数据文件不在是区、页的存储方式,而是基于文件流存储。文件流存储的一个特点之一就是支持快速的读操作,这在数据库重启时将文件流中的数据load到内存中时很能提高效率。

3、内存数据库的数据文件分data file和delta file,而且是成对出现;

内存数据库中插入、更新的数据和删除的数据物理分开存储的,分别用data file和delta file保存。

(1)Data file

Data file用来保存"插入"或者"更新"的数据行,data file中数据行的存储顺序严格按照事务执行的顺序组织,比如data file中第一行的数据来自于事务1,第二行数据来自于事务2,这两行可以是同一个表的数据,也可以是不同表的数据,取决于这两个连续的事务操作的内存优化表是否相同。 这种方式的好处是保证了磁盘IO的连续性,避免随机IO。

Data file的大小是固定的,为128MB,当一个data file被写满了后,SQL会自动新建一个data file。因为数据在data file中保存的顺序是按照事务的执行顺序进行的,所以一张表的数据行(来自多个事务)可能跨越了多个data file,当对多行进行更新操作时,写操作可以分配到多个文件上,并且同时进行,这样就可以加快更新的效率。(下文介绍delta file时会介绍)

如下图,一共有4个data files(浅蓝色),第一个data file的事务范围为100-200,第二个data file的事务范围为200-300……(100、200表示时间戳)

sqlserver2014内存数据库特性介绍

网友评论
<