摘自作者新書《鋒利的SQL》(第2版),網購京東:http://item.jd.com/11692900.html
記憶體優化表是從SQLServer 2014開始引入的,它将資料的讀取、寫入操作都放置到記憶體中完成,這與傳統的磁盤表是最大的不同。此功可以減少鎖的等待問題,進而改善寫入等待延遲,可以用于某些特殊負荷的操作。
但是,要使用記憶體優化表,還有一定的限制要求:
· 必須是64位Enterprise、Developer或Evaluation版SQL Server 2014。
· 處理器需要支援指令cmpxchg16b才能使用記憶體優化表,不過目前所有的64位處理器均支援cmpxchg16b。
· 如果資料庫包含記憶體優化表,則無法更改資料庫排序規則。
· 字元串列隻有在采用BIN2排序規則的情況下,才能在該列上建立索引。并且,無法對不使用BIN2排序規則的索引字元串列使用ORDER BY或GROUP BY語句。
SQL Server需要有足夠的記憶體來保留記憶體優化表和索引中的資料。如果使用行版本控制,還應當提供兩倍于記憶體優化表和索引預期大小的記憶體量。
要想建立記憶體優化表,必須首先在資料庫中建立支援記憶體優化的檔案組。但是,此檔案組一旦建立,隻有在删除資料庫的情況下才能删除。例如,下面的語句在AdventureWorks2014資料庫中建立了名為hk_mod的檔案組,該檔案組存儲在c:\data\hk_mod目錄中。注意語句中的MEMORY_OPTIMIZED_DATA關鍵字,表示建立的是支援記憶體優化的檔案組。
ALTER DATABASE AdventureWorks2014
ADD FILEGROUP hk_mod CONTAINS MEMORY_OPTIMIZED_DATA;
GO
ALTER DATABASE AdventureWorks2014
ADD FILE (NAME='hk_mod',FILENAME='c:\data\hk_mod')
TO FILEGROUP hk_mod;
下面的語句用于建立一個名為T1的記憶體優化表:
USE AdventureWorks2014;
GO
CREATE TABLE dbo.T1 (
Name VARCHAR(20) COLLATE Latin1_General_100_BIN2NOT NULL
PRIMARY KEY NONCLUSTERED HASH WITH(BUCKET_COUNT = 1024),
City VARCHAR(32) NOT NULL,
LastModified DATETIME NOT NULL,
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY =SCHEMA_AND_DATA);
與建立檔案組時一樣,上面語句中指定MEMORY_OPTIMIZED為NO,表示這是一個記憶體優化表。注意上面的DURABILITY選項設定,SCHEMA_AND_DATA表示是持久化資料和結構,雖然記憶體優化表是駐留在記憶體中,但是通過此項設定可以在磁盤上維護一個表的副本,在執行伺服器重新開機等操作時,可以從該副本進行讀取。不過,處于性能考慮,這個副本是存在延遲的,它是在送出事務并将控制權歸還用戶端後不久才儲存到磁盤。作為提高性能的代價,在伺服器崩潰或故障轉移過程中将丢失已送出但未儲存到磁盤的事務。
此外,還可以将DURABILITY設定為SCHEMA_ONLY,表示隻持久化表結構。這樣,這些表的日志和資料都不會存儲在磁盤中,這意味着這些表上的事務不需要任何磁盤I/O操作,但是如果伺服器崩潰或進行故障轉移,則無法恢複資料。
記憶體優化表隻能通過CREATETABLE語句建立,對于已建立的記憶體優化表是無法通過ALTER TABLE語句進行修改的。如果想修改記憶體優化表的結構,一種變通的方法就是再建立一個新記憶體優化表,将源表資料複制過去。
記憶體優化表的删除與磁盤表沒有任何不同,例如,下面語句删除了前面建立的T1表。
DROP TABLE dbo.T1;