使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM