创建数据库
创建内存优化数据文件组
注意:每个数据库只能创建一个内存优化数据文件组。
创建内存优化数据文件
在文件组MemoryOptimizedData中添加一个文件夹MemoryOptimizedDataFile用来保存内存优化表数据
创建内存优化表
内存优化表分为两种类型:
- 持久表(默认):把数据保存在内存和内存优化数据文件组中。
- 非持久表:数据仅保存在内存中,一旦系统因为故障导致重启数据将会丢失。
因为SSMS目前不支持可视化创建,So只能手动创建内存优化表:
1 USE MyDB; 2 GO 3 4 CREATE TABLE MemoryOptimizedTable 5 ( 6 [ID] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH --此处必须定义非聚集哈希索引主键 7 WITH (BUCKET_COUNT = 1024), --此处必须由WITH设置BUCKET_COUNT(存储槽) 8 [Name] NVARCHAR(50) NOT NULL 9 ) 10 WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA); --此处表示开启持久内存优化
注意:目前内存优化表有这些限制(1.不支持外键或约束检查;2.不支持IDENTITY自动增长列;3.不支持DML触发器;4.内存一旦耗尽将导致数据写入失败)
插入15W条测试数据(用时197s):
创建本地编译存储过程
本地编译存储过程比普通存储过程执行更快内存占用更少。
循环执行15W次查询:
1 CREATE PROCEDURE MemoryProc 2 WITH NATIVE_COMPILATION, --声明本地编译 3 SCHEMABINDING, --将视图绑定到架构上 4 EXECUTE AS OWNER --指定执行用户为当前所有者 5 AS 6 BEGIN ATOMIC WITH 7 ( 8 TRANSACTION ISOLATION LEVEL = SNAPSHOT, --指定事务隔离级别(SNAPSHOT确保是提交后的最新结果并且可以重复读取) 9 LANGUAGE = 'us_english' --指定语言 10 ) 11 DECLARE @num INT = 1; 12 WHILE @num <= 150000 13 BEGIN 14 SELECT [ID], [Name] --此处为绑定到架构的具体对象,所以不能使用'*' 15 FROM dbo.MemoryOptimizedTable --此处必须指定当前所有者dbo 16 WHERE [ID] = RAND() * 150000; 17 SET @num = @num + 1; 18 END; 19 END;
内存优化表 VS 普通表
创建普通表:
1 USE MyDB; 2 GO 3 4 CREATE TABLE GeneralTable 5 ( 6 [ID] INT NOT NULL PRIMARY KEY, 7 [Name] NVARCHAR(50) NOT NULL 8 )
同样的插入15W条测试数据(用时324s):
创建普通的存储过程(循环执行15W次查询):
1 CREATE PROCEDURE GeneralProc 2 AS 3 DECLARE @num INT = 1; 4 WHILE @num <= 150000 5 BEGIN 6 SELECT [ID], [Name] 7 FROM GeneralTable 8 WHERE [ID] = RAND() * 150000; 9 SET @num = @num + 1; 10 END;
普通表并发压力性能测试:
并发线程数(Number of Threads):10
用时(Elapsed Time):6907s
内存优化表并发压力性能测试:
并发线程数(Number of Threads):10
用时(Elapsed Time):137s
总结
从并发压力性能测试结果可以看出内存优化表完爆普通表!厉害了!Word内存优化表!官方表示内存优化表将来会有很多改进,让我们拭目以待吧!