zoukankan      html  css  js  c++  java
  • 使用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: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,来得到更好的性能:

    优化进阶

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

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

  • 相关阅读:
    .net反编译原理
    科学使用Log4View2
    头条一面竟然问我Maven?
    SpringCloud Netflix(一) :微服务架构
    Linux环境安装Docker
    Quartz定时任务
    Jedis连接外部Redis
    宝塔phpmyadmin打不开的可能问题及解决方法
    文件上传 Window & Linux
    SpringBoot登录判断
  • 原文地址:https://www.cnblogs.com/seriawei/p/sql-server-in-memory-oltp.html
Copyright © 2011-2022 走看看