创建数据库

address内存优化 内存优化表_内存优化

创建内存优化数据文件组

address内存优化 内存优化表_内存优化_02

注意:每个数据库只能创建一个内存优化数据文件组。

创建内存优化数据文件

MemoryOptimizedData中添加一个文件夹MemoryOptimizedDataFile用来保存内存优化表数据

address内存优化 内存优化表_数据库_03

address内存优化 内存优化表_address内存优化_04

 

address内存优化 内存优化表_数据文件_05

创建内存优化表

    内存优化表分为两种类型:

  • 持久表(默认):把数据保存在内存和内存优化数据文件组中。
  • 非持久表:数据仅保存在内存中,一旦系统因为故障导致重启数据将会丢失。

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):

address内存优化 内存优化表_数据文件_06

 创建本地编译存储过程

    本地编译存储过程比普通存储过程执行更快内存占用更少。

    循环执行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):

 

address内存优化 内存优化表_内存优化_07

    创建普通的存储过程(循环执行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;



    普通表并发压力性能测试:

address内存优化 内存优化表_数据文件_08

并发线程数(Number of Threads):10

Elapsed Time):6907s

    内存优化表并发压力性能测试:

 

address内存优化 内存优化表_存储过程_09

并发线程数(Number of Threads):10

Elapsed Time):137s

总结

    从并发压力性能测试结果可以看出内存优化表完爆普通表!厉害了!Word内存优化表!官方表示内存优化表将来会有很多改进,让我们拭目以待吧!