当前位置: 澳门新濠3559 > 数据库 > 正文

使用内存数据库时,2. 键值对内存数据库

时间:2019-10-18 09:04来源:数据库
在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQLServer 2016的In-MemoryOLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统运行稳定

在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQL Server 2016的In-Memory OLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统运行稳定,写一篇博客,记录一下使用内存数据库的经验。

最近一段时间研究了内存数据库,总结了一下,分享给大家。我们先从应用场景说起。

SQL Server 2016的In-Memory OLTP,通俗地讲,是内存数据库,使用内存优化表(Memory-Optimized Table,简称MOT)来实现,MOT驻留在内存中,使用 Hekaton 内存数据库引擎访问。在查询MOT时,只从内存中读取数据行,不会产生Disk IO消耗;在更新MOT时,数据的更新直接写入到内存中。内存优化表能够在Disk上维护一个数据副本,该副本只用于持久化数据,不用于数据读写操作。

一. 内存数据库的应用场景

在内存数据库中,不是所有的数据都需要存储在内存中,有些数据仍然能够存储在Disk上,硬盘表(Disk-Based Table,简称DBT)是传统的表存储结构,每个Page是8KB,在查询和更新DBT时,产生Disk IO操作,将数据从Disk读取到内存,或者将数据更新异步写入到Disk中。

  • 数据缓存:将经常使用的数据存放在内存中,全局共享,减少和数据库之间的交互频率,提升数据访问速度,主要用于应用程序全局共享缓存。
  • 内存计算:支持通过标准SQL或者LINQ的方式实现对内存数据的聚合、计算和查询,充分发挥、利用应用服务器的资源。

内存数据库将原本存储在Disk上的数据,存储在内存中,利用内存的高速访问优势实现数据的快速查询和更新,但是,内存数据库,不仅仅是存储空间的变化,Hekaton 内存数据库访问引擎实现本地编译模块(Natively compiled),交叉事务(Cross-Container Transaction)和查询互操作(Query Interop):

二. 业界有哪几类主流的内存数据库

  • 本地编译模块:如果代码模块只访问MOT,那么可以将该模块定义为本地编译模块,SQL Server直接将TSQL脚本编译成机器代码;SQL Server 2016支持本地编译的模式有:存储过程(SP),触发器(Trigger),标量值函数(Scalar Function)或内嵌多语句函数(Inline Multi-Statement Function)。相比于解释性(Interpreted)TSQL 模块,机器代码直接使用内存地址,性能更高。
  • 交叉事务:在解释性TSQL模块中,一个事务既能访问硬盘表,也能访问内存优化表;实际上,SQL Server创建了两个事务,一个事务用于访问硬盘表,一个事务用于访问内存优化表,在DMV中,分别使用transaction_id 和 xtp_transaction_id 来标识。
  • 查询互操作:解释性TSQL脚本能够访问内存优化表和硬盘表,本地编译模块只能访问内存优化表。

1. 关系型内存数据库

内存数据被整合到SQL Server关系引擎中,使用内存数据库时,客户端应用程序甚至感受不到任何变化,DAL接口也不需要做任何修改。由于Query Interop的存在,任何解释性TSQL脚本都能透明地访问MOT,只是性能没有本地编译TSQL脚本性能高。在使用分布式事务访问MOT时,必须设置合适的事务隔离级别,推荐使用Read Committed,如果发生MSSQLSERVER_41333 错误,说明产生交叉事务隔离错误(CROSS_CONTAINER_ISOLATION_FAILURE),原因是当前事务的隔离级别太高。

  • 传统关系型数据库场景下,应用层的数据缓存
  • 将传统的关系型数据库表搬到内存中,内存数据和数据库数据之间进行结构映射
  • 支持通过SQL语句的方式实现对内存数据的访问,更加贴合业务实现
  • 将经常使用的数据存放在内存中,减少和数据库之间的交互频率,提升数据访问速度
  • 数据实时/定时同步
  • 有限的事务保证

澳门新濠3559 1

2. 键值对内存数据库

一,创建内存数据库

  • 键值对存储结构
  • 按Key进行数据读取
  • Value支持各种数据类型
  • 类似Redis

内存优化表的数据必须存储在包含Memory_Optimized_Data的File Group中,该FileGroup可以有多个File,每个File实际上是Folder,一个DB只能创建一个包含Memory_Optimized_Data的File Group。

3. 传统数据库的内存数据库引擎

step1,创建一个数据库,创建的Data File的数量最好和CPU内核数量保持一致,存放在不同的物理磁盘上;

  • SQL Server  2016 In Memory OLTP
  • MySQL Memory Engine
  • 在数据库层面提供了内存数据库引擎机制,最大程度的减少磁盘IO
  • 数据类型有一定的限制
  • 事务支持
  • 数据持久化保证

澳门新濠3559 2澳门新濠3559 3

  还有Oracle 的Timesten、SAP的HANA等,这些商业中间件不在我们研究的范围之内。

use master 
go 

--Create database
create database Test_MemboryDB
on Primary
(
name=Test_MemoryDB_1,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_1.mdf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_2,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_2.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_3,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_3.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_4,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_4.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_5,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_5.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_6,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_6.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_7,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_7.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_8,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_8.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_9,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_9.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_10,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_10.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_11,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_11.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_12,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_12.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_13,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_13.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_14,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_14.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_15,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_15.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_16,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_16.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_17,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_17.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_18,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_18.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_19,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_19.ndf',
size=5GB,
FileGrowth=1GB
),
(
name=Test_MemoryDB_20,
filename='D:Program FilesMicrosoft SQL ServerTest_MemoryDB_20.ndf',
size=5GB,
FileGrowth=1GB
)
LOG ON 
( 
name = N'Test_MemboryDB_log', 
filename = N'D:Program FilesMicrosoft SQL ServerTest_MemboryDB_log.ldf' , 
size = 10GB , 
filegrowth = 1GB 
)
GO

  那么,传统数据库和内存数据库之间是什么关系? 相互补充、珠联璧合的关系

View Code

  内存数据库不会独立于传统数据库而单独存在,因为内存是易失的。现在具有持久化功能的内存库,如redis、couchbase等,其持久化功能相较传统数据库还较溥弱,持久化性能也不如传统数据库。因此,内存数据库在一段时期内,将是传统数据库的一种强有力的补充。

step2,为数据库创建一个包含内存优化数据的FileGroup,向该FileGroup中添加“File”,实际上是目录(Directory),用于存储内存优化数据文件,主要是CheckPoint文件,用于还原持久化的内存优化表。

  如果说传统数据库是一支军队,那么内存数据库就是为执行某种特殊任务的特种部队,不要求功能多,但一定要快速、迅猛。

-- Add File Group from memory-optimized data
alter database [Test_MemboryDB]
add filegroup fg_MemoryOptimizedData
contains MEMORY_OPTIMIZED_DATA;

alter database [Test_MemboryDB]
add file 
(
name=Test_MemboryDBDirectory,
filename='D:Program FilesMicrosoft SQL ServerTest_MemboryDBDirectory'
)
to FILEGROUP fg_MemoryOptimizedData;

  我们继续一一对比分析一下上面所述的几类内存数据库。

文件组属性:CONTAINS MEMORY_OPTIMIZED_DATA 子句,指定File Group用于存储内存优化表数据,每个数据库只能指定一个存储内存优化数据的File Group,可以在该File Group下创建多个Directory,分布在不同的物理Disk上,加快内存优化表数据还原的速度。

三. 业界主流的内存数据库

二,创建内存优化表

1. SQL Server 2016 In-Memory OLTP

内存优化表用于存储用户数据,可以持久化存储,数据存储在内存中,同时,在Disk上维护数据的一个副本,通过选项 DURABILITY= SCHEMA_AND_DATA 指定持久化存储内存优化表;也可以只存储在内存中,通过选项DURABILITY= SCHEMA_ONLY指定。在内存优化表上,可以创建nonclustered index 或nonclustered hash index,每个内存优化表中至少创建一个Index。

  SQL Server 2016的In-Memory OLTP,通俗地讲,是内存数据库,使用内存优化表(Memory-Optimized Table,简称MOT)来实现,MOT驻留在内存中,使用 Hekaton 内存数据库引擎访问。在查询MOT时,只从内存中读取数据行,不会产生Disk IO消耗;在更新MOT时,数据的更新直接写入到内存中。内存优化表能够在Disk上维护一个数据副本,该副本只用于持久化数据,不用于数据读写操作。  

--create memory optimized table
create table [dbo].[products]
(
    [ProductID] [bigint] not null,
    [Name] [varchar](64) not null,
    [Price] decimal(10,2) not null,
    [Unit] varchar(16) not null,
    [Description] [varchar](max) null,
    constraint [PK__Products_ProductID] primary key nonclustered hash ([ProductID])with (bucket_count=2000000)
    ,index idx_Products_Price  nonclustered([Price] desc)
    ,index idx_Products_Unit nonclustered hash(Unit) with(bucket_count=40000)
)
with(memory_optimized=on,durability= schema_and_data)
go

  在内存数据库中,不是所有的数据都需要存储在内存中,有些数据仍然能够存储在Disk上,硬盘表(Disk-Based Table,简称DBT)是传统的表存储结构,每个Page是8KB,在查询和更新DBT时,产生Disk IO操作,将数据从Disk读取到内存,或者将数据更新异步写入到Disk中。

1,内存优化:MEMORY_OPTIMIZED

  内存数据库将原本存储在Disk上的数据,存储在内存中,利用内存的高速访问优势实现数据的快速查询和更新,但是,内存数据库,不仅仅是存储空间的变化,Hekaton 内存数据库访问引擎实现本地编译模块(Natively compiled),交叉事务(Cross-Container Transaction)和查询互操作(Query Interop):

[MEMORY_OPTIMIZED = {ON | OFF}]

  本地编译模块:如果代码模块只访问MOT,那么可以将该模块定义为本地编译模块,SQL Server直接将TSQL脚本编译成机器代码;SQL Server 2016支持本地编译的模式有:存储过程(SP),触发器(Trigger),标量值函数(Scalar Function)或内嵌多语句函数(Inline Multi-Statement Function)。相比于解释性(Interpreted)TSQL 模块,机器代码直接使用内存地址,性能更高。

默认值是OFF,指定创建的表是硬盘表;设置选项MEMORY_OPTIMIZED为ON,指定创建的表是内存优化表;

  交叉事务:在解释性TSQL模块中,一个事务既能访问硬盘表,也能访问内存优化表;实际上,SQL Server创建了两个事务,一个事务用于访问硬盘表,一个事务用于访问内存优化表,在DMV中,分别使用transaction_id 和 xtp_transaction_id 来标识。

2,持久性:Durability 

  查询互操作:解释性TSQL脚本能够访问内存优化表和硬盘表,本地编译模块只能访问内存优化表。

DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}

  内存数据被整合到SQL Server关系引擎中,使用内存数据库时,客户端应用程序甚至感受不到任何变化,DAL接口也不需要做任何修改。由于Query Interop的存在,任何解释性TSQL脚本都能透明地访问MOT,只是性能没有本地编译TSQL脚本性能高。在使用分布式事务访问MOT时,必须设置合适的事务隔离级别,推荐使用Read Committed,如果发生MSSQLSERVER_41333 错误,说明产生交叉事务隔离错误(CROSS_CONTAINER_ISOLATION_FAILURE),原因是当前事务的隔离级别太高。

默认值是SCHEMA_AND_DATA,指定创建的内存优化表是持久化的,这意味着,数据更新会持久化存储到Disk上,在SQL Server重启之后,内存优化表的数据能跟根据存储在Disk上的副本还原。选项 SCHEMA_ONLY 指定创建的内存优化表是非持久化的,这意味着Table Schema是持久化存储到Disk上,但是,任何数据更新都不会持久化到Disk上,在SQL Server重启之后,内存优化表的数据会丢失。

2. Apache Ignite

3,哈希索引和范围索引

  Apache Ignite是一个内存数据组织是高性能的、集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升。

内存优化表支持Hash Index,属性 BUCKET_COUNT 指定为Hash Index创建的bucket的数量,一般hash bucket的数量是数据行的1-2倍,如果无法估计bucket的数量,请创建范围索引(NonClustered Index),索引结构是Bw-Tree。

   澳门新濠3559 4

Hash 索引由一个数组和多个数据行链组成,每一个数组元素叫做一个Hash Bucket,通过内置的Hash函数,将Hash索引的Key映射到Hash Bucket上,例如,如果Hash Index的Key是(Col1,Col2),根据HashFunction(Col1,Col2)返回的Hash Value,将数据行映射到指定的Hash Bucket上;如果多个Key映射到同一个Hash Bucket上,那么这些Key组成一个链。例如:数据表结构是(Name,City),在Name字段上创建Hash Index,Hash值相同的数据行链接成一个单向链。

  可以将Ignite视为一个独立的、易于集成的内存组件的集合,目的是改进应用程序的性能和可扩展性。

澳门新濠3559 5

  澳门新濠3559 6

三,创建Natively Compiled SP

  Data Grid:Ignite内存数据网格是一个内存内的键值存储,他可以在分布式集群的内存内缓存数据。 它通过强语义的数据位置和关系数据路由,来降低冗余数据的噪声,使其可以节点数的线性增长,直至几百个节点。 Ignite数据网格速度足够快,经过官方不断的测试,目前,他是分布式集群中支持事务性或原子性数据的最快的实现之一。

本地编译SP在创建时编译成机器代码,整个SP以原子方式执行,这意味着,以SP为单位,整个SP中的所有操作是一个原子操作,要么执行成功,要么执行失败。

  SQL Grid:内存SQL网格为Apache Ignite提供了分布式内存数据库的功能,它水平可扩展,容错并且兼容SQL的ANSI-99标准。 SQL网格支持完整的DML命令,包括SELECT, UPDATE, INSERT, MERGE以及DELETE。 同时支持分布式SQL Join关联

create procedure dbo.usp_GetProduct
    @ProductID bigint not null
with native_compilation, schemabinding, execute as owner
as
begin atomic with (transaction isolation level = snapshot, language = N'US_English')  
select  [ProductID]
      ,[Name]
      ,[Price]
      ,[Unit]
      ,[Description]
from [dbo].[Products]
where ProductID=@ProductID
end
go 

  RDBMS集成: Ignite支持与各种持久化存储的集成,它可以连接数据库,导入模式,配置索引类型,以及自动生成所有必要的XML OR映射配置和Java领域模型POJO,这些都可以轻易地下载和复制进自己的工程。 Ignite可以与任何支持JDBC驱动的关系数据库集成,包括Oracle、PostgreSQL、MS SQL Server和MySQL。

1,在本地编译SP中,能够为参数,变量指定Nullability属性,默认值是NULL

  澳门新濠3559 7

NOT NULL 属性:不能为参数或变量指定NULL值,

  汇总一下,Apache Ignite的功能特性:

  • 在本便编译SP中,为参数指定NOT NULL属性,不能为参数指定NULL值;
  • 在本便编译SP中,为变量定义NOT NULL属性,必须在Declare时初始化变量;
  •   分布式键值存储:Ignite数据网格是一个内存内的键值存储,分布式的分区化的哈希,集群中每个节点都持有所有数据的一部分,这意味着集群内节点越多,就可以缓存的数据越多。 Ignite通过可插拔的哈选算法来决定数据的位置,每个客户端都可以通过插入一个自定义的哈希函数来决定一个键属于那个节点,并不需要任何特殊的映射服务或者命名节点。
  •   内存优化:Ignite在内存中支持2种模式的数据缓存,堆内和堆外。当缓存数据占用很大的堆,超过了Java主堆空间时,堆外存储可以克服JVM垃圾回收(gc)导致的长时间暂停,但数据仍然在内存内。
  •   SQL查询:Ignite支持使用标准的SQL语法(ANSI 99)来查询缓存,可以使用任何的SQL函数,包括聚合和分组。
  •   分布式关联:Ignite支持分布式的SQL关联和跨缓存的关联。
  •   ACID事务:Ignite提供了一个完全符合ACID的分布式事务来保证一致性。 支持乐观和悲观的并发模型以及读提交、可复制读和序列化的隔离级别。 Ignite的事务使用了二阶段提交协议,适当地也进行了很多一阶段提交的优化。
  •   同写和同读:通写模式允许更新数据库中的数据,通读模式允许从数据库中读取数据。
  •   数据库异步更新:Ignite提供了一个选项,通过后写缓存来异步地执行数据库更新
  •   自动持久化:自动化地连接底层数据库并且生成XML的对象关系映射配置和Java领域模型POJO
  •   数据库支持:Ignite可以自动地与外部数据库集成,包括RDBMS、NoSQL和HDFS。

2,本地编译SP必须包含两个选项:SCHEMABINDING 和 ATOMIC Block

  从以上的Apache Ignite的特性看,它就是一个关系型的内存数据库。貌似在这个领域,Apache Ignite做的非常好。这一点非常符合我们技术选型的需要!一句话:

  • SCHEMABINDING:绑定引用的内存优化表
  • ATOMIC Block:在原子块中的所有语句,以单个事务运行;在事务成功时,所有语句都提交成功;在事务失败时,所有语句都回滚。Atomic Bloc保证原子地执行SP,如果SP在其他事务的上下文中被调用,那么该SP开始一个新的事务。
    • Atomic blocks guarantee atomic execution of the stored procedure. If the procedure is invoked outside the context of an active transaction, it will start a new transaction, which commits at the end of the atomic block.

  可以像操作数据库一样,操作内存缓存!

使用Atomic Block必须设置两个选项:

3. FastDB

  • TRANSACTION ISOLATION LEVEL:指定Atomic Block开启事务的隔离级别,通常指定Snapshot隔离级别;
  • LANGUAGE:指定SP上下文的语言;

  FastDb是高效的关系型内存数据库系统,具备实时能力及便利的C 接口。FastDB针对应用程序通过控制读访问模式作了优化。通过降低数据传输的开销和非常有效的锁机制提供了高速的查询。对每一个使用数据库的应用数据库文件被影射到虚拟内存空间中。因此查询在应用的上下文中执行而不需要切换上下文以及数据传输。Fastdb中并发访问数据库的同步机制通过原子指令实现,几乎不增加查询的开销。

3,解释型SP和本地编译SP的区别

FastDB的特点:

解释性SP能够访问硬盘表(Disk-Based Table)和内存优化表(Memory-Optimized Table),其真正的区别是解释性(Interpreted)SP在第一次执行时编译,而本地编译(Natively Compiled)SP是在创建时编译,并且直接编译成机器代码,绑定的是内存地址。

  • FastDB不支持client-server架构因而所有使用FastDB的应用程序必须运行在同一主机上;
  • fastdb假定整个数据库存在于RAM中,并且依据这个假定优化了查询算法和接口。
  • fastdb没有数据库缓冲管理开销,不需要在数据库文件和缓冲池之间传输数据。
  • 整个fastdb的搜索算法和结构是建立在假定所有的数据都存在于内存中的,因此数据换出的效率不会很高。
  • Fastdb支持事务、在线备份以及系统崩溃后的自动恢复。
  • fastdb是一个面向应用的数据库,数据库表通过应用程序的类信息来构造。

4,延迟持久化

缺点:

在本地编译SP中,设置Atoic Block的选项:DELAYED_DURABILITY = ON ,使SP对内存优化表的更新操作,以异步写事务日志方式,延迟持久化到Disk,这意味着,如果内存优化表维护了一个Disk-Based 的副本,数据在内存中修改之后,不会立即更新到Disk-Based 的副本中,这有丢失数据的可能性,但是能够减少Disk IO,提高数据更新的性能。

  • FastDB在接口上仅支持C ,GitHub有个人版的C# SDK
  • 有限的SQL语法支持
  • 个人版开源系统,没有商业支持,未经生产环境验证

四,使用内存优化的表变量和临时表

澳门新濠3559,4. Redis&Memcached

传统的表变量和临时表,都使用tempdb存储临时数据,而tempdb不是内存数据库,使用Disk存储临时表和表变量的数据,会产生Disk IO和竞争,SQL Server提供了内存优化的表变量,将临时数据存储在内存中,详细信息,请参考我的博客:《In-Memory:在内存中创建临时表和表变量》。

  Redis和Memcached,从本质上看,都属于Key-Value内存数据库,Redis无论从稳定性、性能和功能上都要强于MemCached。

五,在内存数据库中使用JSON

  NoSQL结构设计,不支持关系型数据结构。

自从使用JSON之后,我的第一感概是:数据库岂能没有JSON,不管是数据库将值传递前端,还是前端将数据传递到数据库,使用JSON方便很多,相比XML,JSON的使用简单很多,详细信息,请参考我的博客:《使用TSQL查询和更新 JSON 数据》

       Redis我们已经大规模应用了,本次技术选型的重要在于关系型内存数据库上,所以,Redis和MemCached不作深入研究和讨论。

六,内存数据库的事务处理

初步的选型总结:

交叉事务是指在一个事务中,解释性TSQL语句同时访问内存优化表(Memory-Optimized Table,简称MOT)和硬盘表(Disk-Based Table,简称DBT)。在交叉事务中,访问MOT的操作和访问DBT的操作都拥有自己独立的事务序号,就像在一个大的交叉事务下,存在两个单独的子事务,分别用于访问MOT和DBT;在sys.dm_db_xtp_transactions (Transact-SQL)中,访问DBT的事务使用transaction_id标识,访问MOT的事务序号使用xtp_transaction_id标识。详细信息,请参考我的博客:《In-Memory:内存优化表的事务处理》

从需求和功能满足度上看:Apache Ignite 最满足我们的需求,从Apache Ignite的特性看,它就是一个关系型的内存数据库。貌似在这个领域,Apache Ignite做的非常好。这一点非常符合我们技术选型的需要!一句话:

 

可以像操作数据库一样,操作内存缓存!

参考文档:

先放出两张图给大家:

sqlserver2014内存数据库特性介绍

  澳门新濠3559 8

In-Memory OLTP (In-Memory Optimization).aspx)

澳门新濠3559 9

Introduction to Memory-Optimized Tables.aspx)

下一篇文章,将对Apache Ignite做一个深入的技术原型验证和分享。

Natively Compiled Stored Procedures

同时,大家如果有更好的内存数据库,可以推荐给我们。谢谢。

Memory-Optimized Tables

 

试试SQLSERVER2014的内存优化表

周国庆

SQLServer 2014 内存优化表

2017/8/25

SQL Server 2014 内存优化表(1)实现内存优化表

编辑:数据库 本文来源:使用内存数据库时,2. 键值对内存数据库

关键词: 澳门新濠3559