内存数据库,指的是将数据库的数据放在内存中直接操作。相对于存放在磁盘上,内存的数据读写速度要高出很多,故可以提高应用的性能。微软的SQL Server 2014已于2014年4月1日正式发布,SQL 2014一个主要的功能即为内存数据库。
目前来说,数据库镜像和复制是无法与内存优化表兼容的,但AlwaysOn,日志传送,备份还原是完整支持。
由于内存表数据的存放机制和普通表(基于磁盘的表)完全不同,因此内存表的数据需要一个特别的文件夹(注意不是文件哦)来存放
USE [master]
--创建数据库
CREATE DATABASE [TestDB]
ON PRIMARY
( NAME = N'TestDB', FILENAME = N'D:\SQL2104\SQLData\TestDB.mdf' ,
SIZE = 204800KB , MAXSIZE = UNLIMITED, FILEGROWTH = 204800KB )
LOG ON
( NAME = N'TestDB_log', FILENAME = N'D:\SQL2104\SQLData\TestDB_log.ldf' ,
SIZE = 204800KB , MAXSIZE = 2048GB , FILEGROWTH = 204800KB )
GO
--创建内存表使用的文件组
ALTER DATABASE [TestDB] ADD FILEGROUP [TestDB_MFG1] CONTAINS MEMORY_OPTIMIZED_DATA
GO
--创建内存表使用的文件夹
ALTER DATABASE [TestDB]
ADD FILE ( NAME = N'TestDB_MDir1', FILENAME = N'D:\SQL2104\SQLData\TestDB_MDir1')
TO FILEGROUP [TestDB_MFG1]
GO
对于每个数据库,只能创建一个内存优化文件组(Memory-Optimized Filegroup),而对于每个内存优化文件组,可以创建多个关联的文件夹。
PS:内存优化文件组基与FILESTREAM文件组,但是无需为内存优化文件组来启用FILESTREAM。
创建内存表
创建内存表限制比较多:
1. 支持的数据类型:http://msdn.microsoft.com/ZH-CN/library/dn133179(v=sql.120).aspx
2. 内存优化表支持自增,但唯一允许用于 seed 和 increment 的值为 1;(1,1) 是 seed 和 increment 的默认值;
3. 内存优化表不支持CHECK约束,在非hash索引列上也不行;
4. 内存优化表不支持使用的排序规则所具有的代码页并非 1252 的数据类型 char(n) 和 varchar(n);
5. 内存优化表不支持nvarchar(max)或varchar(max)
6. 内存优化表索引不支持未使用 *_BIN2 排序规则的字符列上的索引,在非hash索引列上也不行;
7. 内存优化表上的索引不支持索引键中有可为 Null 的列,在非hash索引列上也不行;
8. 内存优化表必须有至少一个索引或主键
创建内存优化表Demo
CREATE TABLE [dbo].[TB1_IM]
(
[c1] [int] NOT NULL IDENTITY(1,1) PRIMARY KEY
NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
[c2] [nchar](200) COLLATE Chinese_PRC_Stroke_90_BIN2 NOT NULL
INDEX ix_c2 NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
[c3] [nvarchar](200) COLLATE Chinese_PRC_Stroke_90_BIN2 NOT NULL,
[c4] [nvarchar](200) COLLATE Chinese_PRC_Stroke_90_BIN2 NOT NULL,
INDEX ix_c3_c4 NONCLUSTERED HASH(c3,c4) WITH(BUCKET_COUNT=1000000),
INDEX ix_c2_c3 NONCLUSTERED (c2,c3)
)WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA )
关于数据持续性
对于内存优化表,有两种持续性可以选择:SCHEMA_ONLY(非持久表)和SCHEMA_AND_DATA(持久表),SCHEMA_ONLY 选项会导致数据在实例重启后丢失;而对于SCHEMA_AND_DATA(持久表),又可以设置完全持久行还是延迟持续性,延迟持续性选项允许在事务提交时可以不立即将日志写入磁盘,从而提升性能,当然代价就是发生故障时可能丢失数据。