程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 使用SQL Server 2014內存數據庫時需要注意的問題

使用SQL Server 2014內存數據庫時需要注意的問題

編輯:關於SqlServer

本文從產品設計和架構角度分享了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

內存數據庫既可以包含內存優化表和本地編譯存儲過程,又可以包含基於磁盤的表和傳統存儲過程,各個對象之間數據存儲、和訪問的架構如下所示:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved