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