本文從產品設計和架構角度分享了Microsoft內存數據庫方面的使用經驗,希望你在閱讀本文之後能夠了解這些新的對象、概念,從而更好地設計你的架構。
內存數據庫,指的是將數據庫的數據放在內存中直接操作。相對於存放在磁盤上,內存的數據讀寫速度要高出很多,故可以提高應用的性能。微軟的SQL Server 2014已於2014年4月1日正式發布,SQL 2014一個主要的功能即為內存數據庫。
下面,我將著重介紹使用SQL Server 2014內存數據庫時需要注意的地方。
SQL Server 2014內存數據庫針對傳統的表和存儲過程引入了新的結構: memory optimized table(內存優化表)和native stored procedure(本地編譯存儲過程)。
默認情況下Memory optimized table是完全持久的(即為durable memory optimized table),如傳統的基於磁盤的表上的事務一樣,並且完全持久的事務也是支持原子、一致、隔離和持久 (ACID) 的。所不同的是內存優化表的整個表的主存儲是在內存中,即為從內存讀取表中的行,和更新這些行數據到內存中。 並非像是傳統基於磁盤的表按照數據庫數據庫頁面裝載數據庫。內存優化表的數據同時還在磁盤上維護著另一個副本,但僅用於持續性目的。 在數據庫恢復期間,內存優化的表中的數據再次從磁盤裝載。 創建持久的內存優化表方法如下:
CREATE TABLE DurableTbl (AccountNo INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 28713) ,CustName VARCHAR(20) NOT NULL ,Gender CHAR NOT NULL /* M or F */ ,CustGroup VARCHAR(4) NOT NULL /* which customer group he/she belongs to */ ,Addr VARCHAR(50) NULL /* No address supplied is acceptable */ ,Phone VARCHAR(10) NULL /* Phone number */ ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_AND_DATA)
除了默認持久的內存優化表之外,還支持non-durable memory optimized table(非持久化內存優化表),不記錄這些表的日志且不在磁盤上保存它們的數據。 這意味著這些表上的事務不需要任何磁盤 IO,但如果服務器崩潰或進行故障轉移,則無法恢復數據。創建非持久化內存優化表方法如下:
CREATE TABLE NonDurableTbl (AccountNo INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 28713) ,CustName VARCHAR(20) NOT NULL ,Gender CHAR NOT NULL /* M or F */ ,CustGroup VARCHAR(4) NOT NULL /* which customer group he/she belongs to */ ,Addr VARCHAR(50) NULL /* No address supplied is acceptable */ ,Phone VARCHAR(10) NULL /* Phone number */ ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY)
Native compiled stored procedure(本地編譯存儲過程)是針對傳統的存儲過程而言的,是本機編譯存儲過程後生成DLL,由於本機編譯是指將編程構造轉換為本機代碼的過程,這些代碼由處理器指令組成,無需進一步編譯或解釋。與傳統TSQL 相比,本機編譯可提高訪問數據的速度和執行查詢的效率。故通過本機編譯的存儲過程,可在存儲過程中提高查詢和業務邏輯處理的效率。創建方法本地編譯存儲過程方法如下:
CREATE PROCEDURE dbo.usp_InsertNonDurableTbl @AccountNo int, @CustName nvarchar(20), @Gender char(1), @CustGroup varchar(4), @Addr varchar(50), @Phone varchar(10) WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English') BEGIN INSERT INTO [dbo].[DurableTbl] ([AccountNo] ,[CustName] ,[Gender] ,[CustGroup] ,[Addr] ,[Phone]) VALUES (@AccountNo ,@CustName ,@Gender ,@CustGroup ,@Addr ,@Phone) END END GO
內存數據庫既可以包含內存優化表和本地編譯存儲過程,又可以包含基於磁盤的表和傳統存儲過程,各個對象之間數據存儲、和訪問的架構如下所示: