创建数据库
创建内存优化数据文件组
注意:每个数据库只能创建一个内存优化数据文件组。
创建内存优化数据文件
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.内存一旦耗尽将导致数据写入失败)
用时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 )
用时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内存优化表!官方表示内存优化表将来会有很多改进,让我们拭目以待吧!