SQL Server2014存儲引擎:行存儲引擎,列存儲引擎,內存引擎html
SQL Server 2014中的內存引擎(代號爲Hekaton)將OLTP提高到了新的高度。redis
如今,存儲引擎已整合進當前的數據庫管理系統,而使用先進內存技術來支持大規模OLTP工做負載。sql
就算如此,要利用此新功能,數據庫必須包含「內存優化」文件組和表數據庫
即所配置的文件組和表使用Hekaton技術。性能
幸運的是,SQL Server 2014使這一過程變得很是簡單直接。測試
要說明其工做原理,咱們來建立一個名爲TestHekaton的數據庫,而後添加一個內存優化文件組到此數據庫優化
測試環境:Microsoft Azure 大陸版 虛擬機spa
4核 ,7G內存,Windows2012R2.net
SQLSERVER2014企業版3d
實驗
第一個實驗:內存表的簡單使用
步驟1:建立數據庫和MEMORY_OPTIMIZED_DATA文件組
USE master; GO CREATE DATABASE TestHekaton; GO ALTER DATABASE TestHekaton ADD FILEGROUP HekatonFG CONTAINS MEMORY_OPTIMIZED_DATA; GO
注意ALTER DATABASE語句中的ADD FILEGROUP 語句包含文件組的名稱(HekatonFG)和關鍵字CONTAINS MEMORY_OPTIMIZED_DATA
它會指導SQL Server去建立支持內存OLTP引擎所必需的文件組類型。
注意:每一個數據庫只能有一個MEMORY_OPTIMIZED_DATA文件組!!
要確認此文件組已經建立,能夠訪問SSMS中數據庫屬性的Filegroups 界面,以下圖所示。
步驟2:
添加一個存放數據文件的文件夾到文件組,能夠經過ALTER DATABASE語句來實現。
添加一個存放內存優化表數據的文件夾到HekatonFG文件組:
--執行下面語句以後會在C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA路徑下建立一個文件夾 --文件夾名爲HekatonFile --請不要預先建立好這個文件夾 ALTER DATABASE TestHekaton ADD FILE ( NAME = 'HekatonFile', FILENAME ='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\HekatonFile' ) TO FILEGROUP [HekatonFG]; GO
注意:在ADD FILE 語句中,咱們只爲文件路徑提供了一個友好的名稱。
而且,在TO FILEGROUP 語句中,指定剛纔新建的文件組名字
而後能夠去往數據庫屬性的 Files 界面來查看剛剛添加的文件,如圖所示。
好比是這樣
ALTER DATABASE [test99] ADD FILE ( NAME = 'HekatonFile', FILENAME ='D:\DataBase\xtp\' ) TO FILEGROUP [HekatonFG]; GO
步驟3:
在爲數據庫設置了必需的文件組和文件以後,就能夠建立本身的內存優化表了。
當在定義表的時候,會指定其「持久性」。
一個內存優化表能夠是持久的或非持久的。
(1)對於一個持久表是將數據存儲在內存中,並且也保存在內存優化文件組中。
(2)對於一個非持久表,數據是僅存儲在內存中的,因此,若是系統崩潰或重啓,數據就會丟失。
在SQL Server 2014中默認用的是持久表,接下來咱們來深刻了解一下。
當定義一個持久內存優化表的時候,你還必須定義一個基於非彙集哈希索引的主鍵。
在一個哈希索引中,數據是經過一個內存散列表進行訪問的,而非固定大小頁。
哈希索引是在內存優化表中惟一支持的索引類型。
除了在表定義中定義主鍵外,還必須將表配置爲內存優化的,以下CREATE TABLE 語句所示:
USE TestHekaton; GO CREATE TABLE Reseller ( [ResellerID] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1024), [ResellerName] NVARCHAR(50) NOT NULL , [ResellerType] NVARCHAR(20) NOT NULL ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA); INSERT INTO Reseller VALUES ( 1, 'A Bike Store', 'Value Added Reseller' );
ResellerID 字段包含了定義爲非彙集哈希的主鍵。
注意,必須包含一個WITH 語句來指定BUCKET_COUNT 的設置,它代表了在哈希索引中應該建立的bucket數量。
(每一個bucket是一個槽,能夠用來存放一組鍵值對。)
微軟建議bucket的數量應是一到兩倍於你所指望的表所要包含的惟一索引鍵的數量。
因爲每一個數據庫只能有一個MEMORY_OPTIMIZED_DATA文件組,因此建立表的時候就不須要指定表建立在哪一個MEMORY_OPTIMIZED_DATA文件組了
此表定義以第二個WITH 語句結束。
這裏你指定MEMORY_OPTIMIZED 選項爲ON 以及DURABILITY 選項爲SCHEMA_AND_DATA,此選項是針對持久表的。
接着在表中插入一條記錄,這樣就能夠進行測試了。
數據已經插入到表中
這就是建立一個內存優化表的所有步驟。
可是,要記住,SQL Server 2014對這些表有着不少限制。例如,它們不支持外鍵或約束檢查(感受相似於MySQL的memory存儲引擎),
它們也不支持IDENTITY 字段或DML觸發器。最爲重要的是,內存耗盡會致使數據寫入失敗。
步驟4:
另外一方面,內存優化表支持本地編譯存儲過程,只要那些存儲過程只引用內存優化表。
在這種狀況下,存儲過程能夠轉化爲本地代碼native code,這樣會執行更快且要比典型存儲過程須要更少的內存。
除了只引用內存優化表,一個本地編譯存儲過程必須是模式綁定的並運行在一個特定執行內容內。
另外,每一個本地編譯存儲過程必須徹底由一個原子塊組成。
下面的CREATE PROCEDURE 語句定義了一個本地編譯存儲過程,它從前面所建立的Reseller表中檢索數據
CREATE PROCEDURE GetResellerType ( @id INT ) WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH(TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = 'us_english') SELECT ResellerName , ResellerType FROM dbo.Reseller WHERE ResellerID = @id END; GO
在定義了參數以後,包含一個WITH 語句來指定NATIVE_COMPILATION 選項。
注意:此語句還包含SCHEMABINDING 選項和EXECUTE AS 選項,以及指定了OWNER 做爲執行環境。
而WITH 語句負責實現本地編譯存儲過程的三大需求。
要解決原子塊需求,能夠在BEGIN 關鍵字後指定ATOMIC ,以後是另外一個包含有事務隔離級別和語言的WITH 語句。
對於訪問內存優化表的事務,可使用SNAPSHOT,REPEATABLEREAD 或SERIALIZABLE 做爲隔離級別。
並且,對於此語言必須使用一個可用的語言或語言別名。
這是在定義存儲過程時所須要包含的所有內容。一旦建立,就能夠經過執行EXECUTE 語句來對其加以測試,以下例中所示:
EXEC GetResellerType 1;
此語句會返回經銷商的姓名和類型,在本例中分別是ABike Store和Value Added Reseller。
內存優化表不使用 TempDB 來存儲行版本,因此使用內存優化表不用擔憂tempdb數據庫會暴增。
即便沒有打開snapshot隔離級別,內存優化表默認會開啓snapshot隔離級別,對內存優化表的訪問使用的都是snapshot隔離級別
事務不會對內存優化表使用鎖和閂鎖,可是又能夠默認使用snapshot隔離級別保證數據一致性,這是內存表的強大之處
use [test99] /****** Script for SelectTopNRows command from SSMS ******/ SELECT TOP 1000 [ResellerID] ,[ResellerName] ,[ResellerType] FROM [test99].[dbo].[Reseller] WITH (SNAPSHOT) where [ResellerID]>0 and [ResellerID] <60
第一個實驗:內存表的數據查詢速度比較
彙集索引表和內存優化表的比較
建表語句
USE TestHekaton; GO --內存優化表 CREATE TABLE testmemory1 ( [ID] FLOAT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1024), [Name] NVARCHAR(50) NOT NULL ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
USE TestHekaton; GO --彙集索引表 CREATE TABLE testmemory2 ( [ID] FLOAT NOT NULL PRIMARY KEY, [Name] NVARCHAR(50) NOT NULL )
---------------------------------------------------------------
插入性能比較
內存優化表
SET STATISTICS IO ON SET STATISTICS TIME ON INSERT into testmemory1([id],[name]) SELECT [id] ,[name] from sysobjects SET STATISTICS IO OFF SET STATISTICS TIME OFF
Table 'sysschobjs'. Scan count 1, logical reads 33, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 20 ms. (90 row(s) affected) SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
彙集索引表
SET STATISTICS IO ON SET STATISTICS TIME ON INSERT into testmemory2([id],[name]) SELECT [id] ,[name] from sysobjects SET STATISTICS IO OFF SET STATISTICS TIME OFF
Table 'testmemory2'. Scan count 0, logical reads 183, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'sysschobjs'. Scan count 1, logical reads 33, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 10 ms. (90 row(s) affected) SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
-------------------------------------------------------------------------------
查詢性能比較
內存優化表
SET STATISTICS IO ON SET STATISTICS TIME ON SELECT * FROM testmemory1 ORDER BY [ID] DESC SET STATISTICS IO ON SET STATISTICS TIME ON
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 1 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. (90 row(s) affected) SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
彙集索引表
SET STATISTICS IO ON SET STATISTICS TIME ON SELECT * FROM testmemory2 ORDER BY [ID] DESC SET STATISTICS IO ON SET STATISTICS TIME ON
(91 row(s) affected) Table 'testmemory2'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
能夠看到內存優化表讀寫數據(insert 、select)的時候都看不到IO讀寫
補充測試:
咱們先刪除剛纔插入的數據,內存優化表是不支持truncate table的,只能用delete from 表
只可以delete
插入測試
內存優化表
彙集索引表
-------------------------------------------------------------------------------------------------
查詢測試
內存優化表
彙集索引表
咱們看一下事務日誌
CHECKPOINT GO SELECT Context , Operation, AllocUnitName FROM sys.fn_dblog(NULL, NULL)
Context | Operation | AllocUnitName |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_HK_CHAINED | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_HK_CHAINED | NULL |
LCX_NULL | LOP_HK_CHECKPOINT | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_CLUSTERED | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_HEAP | LOP_INSERT_ROWS | sys.xtp_storage |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.xtp_storage.UQ__xtp_stor__3213E83EA8737D06 |
LCX_CLUSTERED | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_CLUSTERED | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_INDEX_LEAF | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_INDEX_LEAF | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_CLUSTERED | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_HEAP | LOP_INSERT_ROWS | sys.xtp_storage |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.xtp_storage.UQ__xtp_stor__3213E83EA8737D06 |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_CLUSTERED | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_INDEX_LEAF | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysallocunits.clust |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrowsets.clust |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysallocunits.clust |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrowsets.clust |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysallocunits.clust |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrowsets.clust |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrscols.clst |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysallocunits.clust |
LCX_CLUSTERED | LOP_COUNT_DELTA | sys.sysrowsets.clust |
LCX_NULL | LOP_BEGIN_CKPT | NULL |
LCX_FILE_HEADER | LOP_MODIFY_STREAMFILE_HDR | NULL |
LCX_BOOT_PAGE_CKPT | LOP_XACT_CKPT | NULL |
LCX_NULL | LOP_END_CKPT | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_HK_CHAINED | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_CLUSTERED | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_HK_CHAINED | NULL |
LCX_NULL | LOP_HK_CHAINED | NULL |
LCX_NULL | LOP_HK_CHECKPOINT | NULL |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_HEAP | LOP_INSERT_ROWS | sys.xtp_storage |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.xtp_storage.UQ__xtp_stor__3213E83EA8737D06 |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_NULL | LOP_BEGIN_XACT | NULL |
LCX_CLUSTERED | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_MARK_AS_GHOST | LOP_DELETE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_NULL | LOP_FS_DOWNLEVEL_OP | NULL |
LCX_HEAP | LOP_INSERT_ROWS | sys.xtp_storage |
LCX_INDEX_LEAF | LOP_INSERT_ROWS | sys.xtp_storage.UQ__xtp_stor__3213E83EA8737D06 |
LCX_NULL | LOP_COMMIT_XACT | NULL |
LCX_NULL | LOP_HK | NULL |
LCX_CLUSTERED | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_CLUSTERED | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_INDEX_LEAF | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_INDEX_LEAF | LOP_EXPUNGE_ROWS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSClusIdx |
LCX_PFS | LOP_SET_BITS | sys.filestream_tombstone_2073058421.FSTSNCIdx |
LCX_PFS | LOP_MODIFY_HEADER | Unknown Alloc Unit |
總結
內存優化表也會寫事務日誌的,在讀寫操做的時候發現內存優化表沒有I/O次數,應該是數據都已經在內存裏了
內存優化表的主要技術限制
1. 排序規則
內存優化表的排序規則能夠從數據庫的排序規則繼承下來,也可以使用 COLLATE 關鍵字顯式指定。 若是數據庫包含內存優化表或本機編譯存儲過程,則沒法更改數據庫排序規則。
排序規則必須是1252代碼頁,例如 SQL_Latin1_General_CP1_CI_AS。不然報錯。
消息 12329,級別 16,狀態 103,第 1 行
內存優化表 不支持使用的排序規則所具備的代碼頁並不是 1252 的數據類型 char(n) 和 varchar(n)。
做爲一種變通的方案,可使用數據類型 nchar(n) 和 nvarchar(n) 。
2. 數據行的寬度
每一行數據不能超過1個頁(8KB)。不然報錯。
消息 41307,級別 16,狀態 1,第 1 行
已超過內存優化的表的 8060 字節行大小限制。請簡化表定義。
3. 索引
非彙集哈希索引是內存優化表惟一支持的索引類型。在一個哈希索引中,數據是經過一個內存散列表進行訪問的,而非固定大小頁。
4. 內存優化表事務隔離級別
訪問內存優化表的事務支持的隔離級別:SNAPSHOT,REPEATABLE READ,SERIALIZABLE,READ COMMITTED 。
內存優化表不使用鎖。只能使用更高的隔離級別(如 REPEATABLE READ 和 SERIALIZABLE)。
不支持鎖定提示。改成經過事務隔離級別更改。
(支持 NOLOCK 是由於 SQL Server 不對內存優化表使用鎖。請注意,與基於磁盤的表不一樣,NOLOCK 對於內存優化表並不表示跟READ UNCOMMITTED 行爲相同。)
事務
跨容器事務
術語「跨容器」源於這樣的事實:事務跨兩個事務管理容器運行,一個用於基於磁盤的表,另外一個用於內存優化表。
一個事務須要訪問磁盤表和內存表就叫跨容器事務
在單個跨容器事務中,可使用不一樣的隔離級別來訪問基於磁盤的表和內存優化表。
這種差別經過顯式表提示(如 WITH (SERIALIZABLE))或數據庫選項 MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT(若是事務隔離級別配置爲 READ COMMITTED 或 READ UNCOMMITTED,此選項會將內存優化表的隔離級別隱式提高爲 SNAPSHOT)來體現。
若是使用跨容器事務須要設置
針對整個庫
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
或
針對單條語句
WITH (SERIALIZABLE)
WITH (SNAPSHOT)
--(1)不打開MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT 要顯式使用with(snapshot) ALTER DATABASE [test] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=off BEGIN TRANSACTION; SELECT * FROM [dbo].[users] AS A INNER JOIN [dbo].[Reseller] AS B with(snapshot) ON A.ID=B.RESELLERID COMMIT TRANSACTION; --(2)打開MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ALTER DATABASE [test] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=on BEGIN TRANSACTION; SELECT * FROM [dbo].[users] AS A INNER JOIN [dbo].[Reseller] AS B ON A.ID=B.RESELLERID COMMIT TRANSACTION;
若是你們接觸過redis數據庫的話,上面的限制其實不難理解,走起君以爲內存優化表其實就是把redis數據庫嵌入到SQL Server裏面,並加入了一些關係型數據庫特性
更多詳細資料能夠參考:
SQL Server 2014 內存優化表(1)實現內存優化表
若有不對的地方,歡迎你們拍磚o(∩_∩)o