本文从产品设计和架构角度分享了Microsoft内存数据库方面的使用经验,希望你在阅读本文之后能够了解这些新的对象、概念,从而更好地设计你的架构。
内存数据库,指的是将数据库的数据放在内存中直接操作。相对于存放在磁盘上,内存的数据读写速度要高出很多,故可以提高应用的性能。微软的SQL Server 2014已于2014年4月1日正式发布,SQL 2014一个主要的功能即为内存数据库。
下面,我将着重介绍使用SQL Server 2014内存数据库时需要注意的地方。
关于内存数据库
SQL Server 2014内存数据库针对传统的表和存储过程引入了新的结构: memory optimized table(内存优化表)和native stored procedure(本地编译存储过程)。
默认情况下Memory optimized table是完全持久的(即为durable memory optimized table),如传统的基于磁盘的表上的事务一样,并且完全持久的事务也是支持原子、一致、隔离和持久 (ACID) 的。所不同的是内存优化表的整个表的主存储是在内存中,即为从内存读取表中的行,和更新这些行数据到内存中。 并非像是传统基于磁盘的表按照数据库数据库页面装载数据库。内存优化表的数据同时还在磁盘上维护着另一个副本,但仅用于持续性目的。 在数据库恢复期间,内存优化的表中的数据再次从磁盘装载。 创建持久的内存优化表方法如下:
CREATE TABLE DurableTbl (AccountNo INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 28713) ,CustName VARCHAR(20) NOT NULL ,Gender CHAR NOT NULL /* M or F */ ,CustGroup VARCHAR(4) NOT NULL /* which customer group he/she belongs to */ ,Addr VARCHAR(50) NULL /* No address supplied is acceptable */ ,Phone VARCHAR(10) NULL /* Phone number */ ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_AND_DATA)
除了默认持久的内存优化表之外,还支持non-durable memory optimized table(非持久化内存优化表),不记录这些表的日志且不在磁盘上保存它们的数据。 这意味着这些表上的事务不需要任何磁盘 IO,但如果服务器崩溃或进行故障转移,则无法恢复数据。创建非持久化内存优化表方法如下:
CREATE TABLE NonDurableTbl (AccountNo INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 28713) ,CustName VARCHAR(20) NOT NULL ,Gender CHAR NOT NULL /* M or F */ ,CustGroup VARCHAR(4) NOT NULL /* which customer group he/she belongs to */ ,Addr VARCHAR(50) NULL /* No address supplied is acceptable */ ,Phone VARCHAR(10) NULL /* Phone number */ ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY)
Native compiled stored procedure(本地编译存储过程)是针对传统的存储过程而言的,是本机编译存储过程后生成DLL,由于本机编译是指将编程构造转换为本机代码的过程,这些代码由处理器指令组成,无需进一步编译或解释。与传统TSQL 相比,本机编译可提高访问数据的速度和执行查询的效率。故通过本机编译的存储过程,可在存储过程中提高查询和业务逻辑处理的效率。创建方法本地编译存储过程方法如下:
CREATE PROCEDURE dbo.usp_InsertNonDurableTbl @AccountNo int, @CustName nvarchar(20), @Gender char(1), @CustGroup varchar(4), @Addr varchar(50), @Phone varchar(10) WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English') BEGIN INSERT INTO [dbo].[DurableTbl] ([AccountNo] ,[CustName] ,[Gender] ,[CustGroup] ,[Addr] ,[Phone]) VALUES (@AccountNo ,@CustName ,@Gender ,@CustGroup ,@Addr ,@Phone) END END GO
内存数据库既可以包含内存优化表和本地编译存储过程,又可以包含基于磁盘的表和传统存储过程,各个对象之间数据存储、和访问的架构如下所示:
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, 内存
, 编译
, sql server 2014
, 存储过程
, 磁盘
, sql2014
, 内存表
, non native
本机
sqlserver 内存数据库、sql server内存数据库、支持sql的内存数据库、sqllite 内存数据库、sql内存数据库,以便于您获取更多的相关知识。