使用SQLServer内存优化表InMemoryOLTP

database

如果你的系统有高并发的要求,可以尝试使用SQL Server内存优化表来提升你的系统性能。你甚至可以把它当作Redis来使用。

要使用内存优化表,首先要在现在数据库中添加一个支持内存优化的文件组。

Memory Optimized File Group

可以使用下列脚本来向现有数据库添加内存优化文件组:

ALTER DATABASE SomeDatabase

ADD FILEGROUP Memory

CONTAINS MEMORY_OPTIMIZED_DATA;

ALTER DATABASE SomeDatabase

ADD FILE

(

NAME = "SomeDatabase_InMemory",

FILENAME = "E:DatabaseSomeDatabase_InMemory"

)

TO FILEGROUP Memory;

ALTER DATABASE SomeDatabase

SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;

GO

 

创建内存优化表,使用MEMORY_OPTIMIZED = ON来启用内存优化:

CREATE TABLE [dbo].[CachedData]

(

[Key] [VARCHAR](900) NOT NULL,

[Data] [VARBINARY](MAX) NOT NULL,

[Expiry] [DATETIME] NOT NULL,

PRIMARY KEY NONCLUSTERED ([Key] ASC)

)

WITH (MEMORY_OPTIMIZED = ON);

 

这样内存优化表就可以使用了,另外如果你的数据不需要进行持久化存储,可以使用DURABILITY = SCHEMA_ONLY,来得到更好的性能:

  • Defining Durability for Memory-Optimized Objects

优化进阶

在使用内存优化表的过程中发现,当并发大或数据库压力大时,访问内存优化表会提示内存不足的情况,但实际内存是够的。这其实是一个误报,可以查看微软官方文档了解更多详情:

  • Resolve Out Of Memory issues

简单的说,要解决这个问题就是需要打开Resource Governor,Resource Governor在默认情况下是关闭的。

为了更好的管理资源的使用情况,我们需要给缓存的这个数据库创建一个独立的Resource Pool,与系统默认的Resource Pool独立开。

Create Resource Pool

创建一个新的Resource Pool:

-- Disable resource governor

ALTER RESOURCE GOVERNOR DISABLE;

GO

CREATE RESOURCE POOL CacheDbPool

WITH

(

MAX_CPU_PERCENT = 50,

MAX_MEMORY_PERCENT = 30

);

GO

-- Reconfigure resource governor

-- Reconfigure enables resource governor

ALTER RESOURCE GOVERNOR RECONFIGURE;

GO

 

详细配制参数可参阅微软官方文档:

  • Resource Governor Resource Pool

Bind Resource Pool

将新建的Resource Pool和数据库进行关联:

-- Bind Database with resource pool

EXEC sys.sp_xtp_bind_db_resource_pool @database_name = N"SomeDatabase",

@pool_name = N"CacheDbPool";

-- Take database offline and then bring it back online to begin using resource pool.

GO

USE [master];

GO

ALTER DATABASE [SomeDatabase] SET OFFLINE;

GO

ALTER DATABASE [SomeDatabase] SET ONLINE;

GO

 

这样内存优化就设置完成了。

如果需要删除Resource Pool,需要先解绑数据库:

-- Unbind resource pool and drop it.

EXEC sys.sp_xtp_unbind_db_resource_pool @database_name = N"SomeDatabase";

DROP RESOURCE POOL CacheDbPool;

以上是 使用SQLServer内存优化表InMemoryOLTP 的全部内容, 来源链接: utcz.com/z/531508.html

回到顶部