sqlserver2014内存数据库特性介绍

2019-10-07 18:30:18于海丽

因此,即使服务器发生了宕机或者断电,下次数据库重启时会按照已经保存在磁盘中事务日志将业务redo(重做),所以不要担心数据会丢失。

另外,需要补充的是,内存数据库只会对持久性表将已提交的事物日志保存到磁盘中。这样做的好处可以减少写磁盘的次数。内存数据库支持频繁、快速的增、删、改等操作,这个强度远远高于传统数据库,数据库需要为每笔操作写日志,这样就会产生大量磁盘IO,写日志操作将有可能成为性能瓶颈,不记录未提交的事务日志就减少写日志的数量,从而可以提高数据库的性能。

有同学会想,不记录未提交事务的日志会不会导致数据不一致呢?

肯定不会,因为日志在写入磁盘前不可能发生先把"脏数据"写入到磁盘的现象(下面介绍checkpoint的时候会介绍原因)。

(2)CheckPoint

在内存数据库中,CheckPoint的主要目的就是将内存中的"数据"写入到磁盘中,从而在数据库崩溃或者重启时减少数据恢复的时间。不需要数据库逐条读取所有的日志来恢复数据。默认情况下Checkpoint是周期性进行的,当日志至上次checkpoint后增加了512M时会触发新一轮CheckPoint。

在传统数据库这种,Checkpoint可以将未提交的数据flush到磁盘的mdf文件中,这个现象在内存数据库中不会发生,因为内存数据库只将已提交事务的日志,而在写日志(到磁盘)之前不可能将数据先写到磁盘中,因此可以保证写到磁盘中的数据一定是已提交事务的数据。

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

答案:不是按照页的方式,一行的限制大小为8060Bytes。

内存优化表是基于行版本存储的,同一行在内存中会有多个版本,可以将内存优化表的存储结构看作是该表中 所有行的多个行版本的集合。

内存优化表中的行跟传统数据库的行结构是不一样的,下图描述了内存优化表中一行的数据结构:

在内存优化表中,一行有两个大部分组成:Row header和Row body,

Row header记录这个行的有效期(开始时间戳和结束时间戳)和索引指针

Row body记录了一行的实际数据。

在内存优化表中,行版本的数量是由针对该行的操作次数决定的,比如:每更新一次,就会新产生一行,增加一个行版本,新行有新的开始时间戳,新行产生后,原来的数据行会自动填充结束时间戳,意味这行已经过期。

备注:上图实际上只有3行,第1行有3个行版本,第2行有2个行版本,第3行有4个行版本。

相关文章 大家在看