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

如果你的系统有高并发的要求,可以尝试使用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;

原文地址:http://www.zkea.net/codesnippet/detail/sql-server-in-memory-oltp.html

posted @   ZKEA  阅读(1772)  评论(1编辑  收藏  举报
编辑推荐:
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
阅读排行:
· ShadowSql之.net sql拼写神器
· 感觉程序员要被 AI 淘汰了?学什么才有机会?
· MQTT协议发布和订阅的实现,一步步带你实现发布订阅服务。
· Dify开发必备:分享8个官方文档不曾解释的关键技巧
· 活动中台系统慢 SQL 治理实践
历史上的今天:
2017-11-22 纸壳CMS 2.3,正式加入商城功能
点击右上角即可分享
微信分享提示