欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用SQL Server内存优化表 In-Memory OLTP

程序员文章站 2022-11-07 09:55:05
如果你的系统有高并发的要求,可以尝试使用SQL Server内存优化表来提升你的系统性能。你甚至可以把它当作Redis来使用。 ......

如果你的系统有高并发的要求,可以尝试使用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:\database\somedatabase_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,来得到更好的性能:

优化进阶

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

简单的说,要解决这个问题就是需要打开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

 

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

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;

原文地址: