【0】基本介紹
【0.1】概述介紹
內存優化表是使用 CREATE TABLE (Transact-SQL) 創建而成的表。
默認情況下,內存優化表具有完全持久性。與(傳統)基於磁盤的表上的事務一樣,內存優化表上的事務具有完全原子性、一致性、隔離性和持久性 (ACID)。
內存優化表和本機編譯的存儲過程僅支持一部分 Transact-SQL 功能。
自 SQL Server 2016 起以及在 Azure SQL 數據庫中,內存中 OLTP 特定的 排序規則或代碼頁 沒有任何限制。
內存優化表的主存儲器是主要內存。 從內存讀取表中的行和將這些行寫入內存。 表數據的另一個副本維護在磁盤上,但僅用於持續性目的。
有關持久表的詳細信息,請參閱 創建和管理用於內存優化的對象的存儲 。 在數據庫恢復期間(例如, 在服務器重啟后),內存優化表中的數據只能從磁盤讀取。
為了獲得更大的性能提升,內存中 OLTP 支持事務持續性延遲的持久表。 延遲的持久事務在提交事務並將控制權歸還客戶端后不久即保存到磁盤。 作為提高性能的代價,在服務器崩潰或故障轉移過程中將丟失已提交但未保存到磁盤的事務。
除了默認持久的內存優化表之外, SQL Server 還支持非持久的內存優化表,不記錄這些表的日志且不在磁盤上保存它們的數據。 這意味着這些表上的事務不需要任何磁盤 IO,但如果服務器崩潰或進行故障轉移,則無法恢復數據。
內存中 OLTP 與 SQL Server 集成,以便在所有方面(如開發、部署、可管理性和可支持性)提供無縫體驗。 數據庫可包含內存中對象以及基於磁盤的對象。
內存優化表中的行是版本化的。 這意味着表中的每行都可能有多個版本。 所有行版本均維護在同一個表數據結構中。 行版本控制用於實現對同一行的並發讀取和寫入。 有關對同一行的並發讀取和寫入的更多信息,請參閱 內存優化表中的事物。
下圖展示多版本控制。 該圖顯示了一個包含三行的表,其中,每行都有不同的版本。
該表有三行:r1、r2 和 r3。 r1 有三個版本,r2 有兩個版本,r3 有四個版本。 注意,同一行的不同版本不必占用連續的內存位置。 不同的行版本可分散到整個表數據結構中。
可將內存優化的表數據結構視為一個行版本集合。 基於磁盤的表中的行以頁和區形式組織,各個行借助頁碼和頁偏移量進行尋址,而內存優化表中的行版本則借助 8 字節的內存指針進行尋址。
可通過以下兩種方式訪問內存優化表中的數據:
-
通過本機編譯的存儲過程。
-
通過本機編譯的存儲過程之外的解釋型 Transact-SQL。 這些 Transact-SQL 語句可位於解釋型存儲過程內,也可以是臨時 Transact-SQL 語句
【0.2】性質概念總結
(1)內存優化表具有完全持久性(可以設置持久或者完全內存),且具有事務ACID屬性。且支持延遲性事務(參考:sql server2014中的delayed_durability)
(2)如果重啟了,內存優化表中的數據只能從磁盤讀取。
(3)無鎖機制, 並發(如閂鎖爭用或阻塞)影響
(4)內存優化表中的行是版本化的(且默認是快照隔離級別),不占用tempdb空間
(5)內存優化表可以額外支持下列方式
-
通過本機編譯的存儲過程。
-
通過本機編譯的存儲過程之外的解釋型 Transact-SQL。 這些 Transact-SQL 語句可位於解釋型存儲過程內,也可以是臨時 Transact-SQL 語句。
【1】基本使用
【1.0】使用大概步驟與限制
步驟:
(1)創建數據庫和MEMORY_OPTIMIZED_DATA文件組(alter database add filegroup,每個數據庫只能有一個MEMORY_OPTIMIZED_DATA文件組!!)
(2)添加一個存放數據文件的文件夾到文件組(請不要預先創建好這個文件夾,用alter database add file() to filegroup)
(3)創建持久化/非持久化 的內存優化表(sql server2014默認是持久化的),同時你還必須定義一個基於非聚集哈希索引的主鍵。哈希索引是在內存優化表中唯一支持的索引類型。
(4)使用本地編譯存儲過程:內存優化表支持本地編譯存儲過程,只要那些存儲過程只引用內存優化表。
限制:
(1)內存優化表必須放在有 CONTAINS MEMORY_OPTIMIZED_DATA 文件組的數據庫下。
(2)內存優化表必須定義一個基於非聚集哈希索引的主鍵,且該表不支持外鍵或約束檢查
(3)內存優化表必須要有足夠的內存,否則插入更新等操作會失敗。
(4)SQL Server 2014對這些表有着很多限制。例如,它們不支持外鍵或約束檢查(感覺類似於MySQL的memory存儲引擎),它們也不支持IDENTITY 字段或DML觸發器。
use master go --[1.0] create database create database test3; --[1.1] create filegroup contains memory_optimized_data; alter database test3 add filegroup memory_FG CONTAINS memory_optimized_data; go --[2.0]create a store folder for memory_fg alter database test3 add file ( name='memory_on_file', filename='c:\mssql\memory_fg_file' ) to filegroup memory_FG go --[3.0] create a memory table use test3; create table memory_test ( id int not null primary key nonclustered hash with(bucket_count=1024) ,st1 nvarchar(100) ,st2 nvarchar(100) ) with (memory_optimized=on,durability=schema_and_data); insert into memory_test values(1,'a','b');
【1.1】創建數據庫與MEMORY_OPTIMIZED_DATA文件組
use master go --[1.0] create database create database test3; --[1.1] create filegroup contains memory_optimized_data; alter database test3 add filegroup memory_FG CONTAINS memory_optimized_data; go
注意ALTER DATABASE語句中的ADD FILEGROUP 語句包含文件組的名稱(HekatonFG)和關鍵字CONTAINS MEMORY_OPTIMIZED_DATA
它會指導SQL Server去創建支持內存OLTP引擎所必需的文件組類型。
注意:每個數據庫只能有一個MEMORY_OPTIMIZED_DATA文件組!!
可以通過SSMS屬性查看文件組,或者 sys.database_files df join sys.filegroups 來查看文件組是否存在。
【1.2】添加一個存放數據文件的文件夾到文件組
添加一個存放數據文件的文件夾到文件組(請不要預先創建好這個文件夾,用alter database add file() to filegroup)
--[2.0] use master; create a store folder for memory_fg alter database test3 add file ( name='memory_on_file', filename='c:\mssql\memory_fg_file' ) to filegroup memory_FG go
注意:在ADD FILE 語句中,我們只為文件路徑提供了一個友好的名稱。
並且,在TO FILEGROUP 語句中,指定剛才新建的文件組名字
【1.3】創建內存優化表
--[3.0] create a memory table use test3; create table memory_test ( id int not null primary key nonclustered hash with(bucket_count=1024) ,st1 nvarchar(100) ,st2 nvarchar(100) ) with (memory_optimized=on,durability=schema_and_data); insert into memory_test values(1,'a','b');
說明:
ResellerID 字段包含了定義為非聚集哈希的主鍵。
注意,必須包含一個WITH 語句來指定BUCKET_COUNT 的設置,它表明了在哈希索引中應該創建的bucket數量。
(每個bucket是一個槽,可以用來存放一組鍵值對。)
微軟建議bucket的數量應是一到兩倍於你所期望的表所要包含的唯一索引鍵的數量。
由於每個數據庫只能有一個MEMORY_OPTIMIZED_DATA文件組,所以創建表的時候就不需要指定表創建在哪個MEMORY_OPTIMIZED_DATA文件組了
此表定義以第二個WITH 語句結束。
這里你指定MEMORY_OPTIMIZED 選項為ON(off為普通磁盤表,off為默認選項) 以及DURABILITY 選項為SCHEMA_AND_DATA(schema_only是單純的內存表,沒有持久化),此選項是針對持久表的。
報錯:表示只支持nvarchar
【2】參考文檔
樺仔:
試試sql server2014內存優化表:https://www.cnblogs.com/lyhabc/p/3691911.html