日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第一次接触终极事务处理——Hekaton

發(fā)布時(shí)間:2025/3/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一次接触终极事务处理——Hekaton 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在這篇文章里,我想給出如何與終極事務(wù)處理(Extreme Transaction Processing (XTP)?)的第一次接觸,即大家熟知的Hakaton。如果你想對(duì)XTP有個(gè)很好的概況認(rèn)識(shí),我推薦Kalen Delaney寫(xiě)的關(guān)于它的白皮書(shū),中文版本點(diǎn)此下載,另外微軟研究院也發(fā)布了題為“對(duì)于內(nèi)存數(shù)據(jù)庫(kù)的高性能并發(fā)控制機(jī)制(High-Performance Concurrency Control Mechanisms for Main-Memory Databases)”的研究白皮書(shū),點(diǎn)此下載。

XTP明確為你指出:對(duì)于你的SQL Server數(shù)據(jù)庫(kù),在后臺(tái)是存儲(chǔ)在文件流(FILESTREAM) 文件組里。因此當(dāng)你想要使用XTP,首先你要做的是,增加一個(gè)新的文件流(FILESTREAM)?文件組到你對(duì)應(yīng)的數(shù)據(jù)庫(kù)。新的文件組也必須標(biāo)上MEMORY_OPTIMIZED_DATA屬性。以下腳本請(qǐng)?jiān)?4位系統(tǒng)里的SQL Server 2014里運(yùn)行。

1 -- Create new database 2 CREATE DATABASE TestDatabase 3 GO 4 5 --Add MEMORY_OPTIMIZED_DATA filegroup to the database. 6 ALTER DATABASE TestDatabase 7 ADD FILEGROUP XTPFileGroup CONTAINS MEMORY_OPTIMIZED_DATA

?點(diǎn)擊【數(shù)據(jù)庫(kù)屬性】【文件組】,可以看到【內(nèi)存優(yōu)化數(shù)據(jù)】。

?在你創(chuàng)建新FILESTREAM文件組后,你還需要添加一個(gè)新的文件到這個(gè)文件組。

1 -- Add a new file to the previous created file group 2 ALTER DATABASE TestDatabase ADD FILE 3 ( 4 NAME = N'HekatonFile1', 5 FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\HekatonFile1' 6 ) 7 TO FILEGROUP [XTPFileGroup] 8 GO

在我們已經(jīng)準(zhǔn)備好用于XTP的數(shù)據(jù)庫(kù)后,最后我們可以添加我們的內(nèi)存優(yōu)化表(Memory Optimized Table)——這個(gè)名字就是SQL Server所指的XTP表:

?看到這個(gè)截屏,估計(jì)你很期待一個(gè)非常酷的表創(chuàng)建向?qū)?#xff0c;但事實(shí)上我們只看到一個(gè)T-SQL腳本模板——沒(méi)別啥東東。希望微軟對(duì)此在后續(xù)版本會(huì)有所改進(jìn)……下面是創(chuàng)建一個(gè)XTP表的必需腳本:

1 USE TestDatabase 2 -- Let's create a new Memory Optimized Table 3 CREATE TABLE TestTable 4 ( 5 Col1 INT NOT NULL, 6 Col2 VARCHAR(100) NOT NULL, 7 Col3 VARCHAR(100) NOT NULL 8 CONSTRAINT chk_PrimaryKey PRIMARY KEY NONCLUSTERED HASH (Col1) WITH (BUCKET_COUNT = 1024) 9 ) WITH (MEMORY_OPTIMIZED = ON) 10 GO

哎呀,報(bào)錯(cuò)了。因?yàn)榘硞冇玫氖侵形陌姹镜腟QL Server 2014,排序規(guī)則是:Chinese_PRC_CI_AS

看來(lái)對(duì)中文字符的支持還不是很好,我們可以換用數(shù)據(jù)類型 nchar(n) 或 nvarchar(n)。

1 USE TestDatabase 2 -- Let's create a new Memory Optimized Table 3 CREATE TABLE TestTable 4 ( 5 Col1 INT NOT NULL, 6 Col2 NVARCHAR(100) NOT NULL, 7 Col3 NVARCHAR(100) NOT NULL 8 CONSTRAINT chk_PrimaryKey PRIMARY KEY NONCLUSTERED HASH (Col1) WITH (BUCKET_COUNT = 1024) 9 ) WITH (MEMORY_OPTIMIZED = ON) 10 GO

在XTP里額每個(gè)表都必須要有一個(gè)非聚集哈希索引(Non-Clustered Hash Index)的約束。聚集哈希索引(Clustered Hash Index)目前尚不支持。你還要用BUCKET_COUNT子句來(lái)指定桶數(shù)。最后你要為數(shù)據(jù)庫(kù)標(biāo)上MEMORY_OPTIMIZED。恭喜您,你已經(jīng)創(chuàng)建了您的第一個(gè)內(nèi)存優(yōu)化表——這個(gè)一點(diǎn)都不難!

使用這個(gè)新表非常簡(jiǎn)單。我們來(lái)插入幾條記錄:

1 -- Let's insert a simple record into the new table 2 INSERT INTO TestTable (Col1, Col2, Col3) VALUES (1, 'Woody', 'Tu') 3 GO

但是XTP的真正威力是在處理并發(fā)用戶的時(shí)候,因?yàn)闆](méi)有鎖/阻塞/封鎖(Locking/Blocking/Latching)。連排它鎖(Exclusive Locks (X)?)也米有了。平常當(dāng)我們?cè)凇捌胀ā北砩线\(yùn)行INSERT語(yǔ)句時(shí),在表上會(huì)有IX鎖,在數(shù)據(jù)頁(yè),在記錄本身會(huì)有一個(gè)X鎖。但在XTP里,這些鎖全不見(jiàn)了。來(lái)看下面的查詢:?

1 -- Make an insert in an explicit transaction 2 BEGIN TRANSACTION 3 4 INSERT INTO TestTable (Col1, Col2, Col3) VALUES (2, 'Smart', 'GZ') 5 6 -- No IX, X locks anymore! 7 SELECT * FROM sys.dm_tran_locks 8 WHERE request_session_id = @@SPID 9 10 COMMIT 11 GO

sys.dm_tran_locks的輸出結(jié)果可以看到,只有在表本身有一個(gè)模式穩(wěn)定鎖(Schema Stability Lock (Sch-S)?),但I(xiàn)X和X鎖都消失了——非常酷!

當(dāng)你運(yùn)行剛才的腳本不馬上提交事務(wù):

1 BEGIN TRANSACTION 2 3 INSERT INTO TestTable (Col1, Col2, Col3) VALUES (3, 'Cn', 'Blog')

你仍然可以從另外一個(gè)會(huì)話通過(guò)SELECT語(yǔ)句無(wú)鎖的獲得最新數(shù)據(jù),在執(zhí)行查詢之前,我們?cè)诠ぞ邫邳c(diǎn)擊顯示實(shí)際的執(zhí)行計(jì)劃:

1 SELECT * FROM dbo.TestTable

?

SQL Server在執(zhí)行計(jì)劃里使用了Index Scan (NonClusteredHash) 運(yùn)算符。

在XTP之前,這個(gè)行為在數(shù)據(jù)庫(kù)里只能通過(guò)啟用樂(lè)觀并發(fā)控制(Optimistic Concurrency)來(lái)建立——在SQL Server 2005后才引入了Read Committed Snapshot IsolationSnapshot Isolation

我們來(lái)試下UPDATE語(yǔ)句:

1 UPDATE TestTable SET Col2 = 'Test' WHERE Col1 = 1 2 GO

當(dāng)我們看UPDATE執(zhí)行計(jì)劃時(shí),除了Index Seek (NonClusteredHash)運(yùn)算符,這里沒(méi)啥特別的地方。因此XTP能掃描和查找哈希索引(Hash Indexes)。我們來(lái)試下顯示事務(wù)里的UPDATE語(yǔ)句:

1 -- Let's try the UPDATE statement in an explicit transaction 2 BEGIN TRANSACTION 3 4 UPDATE TestTable SET Col2 = 'Test' WHERE Col1 = 1 5 6 SELECT * FROM sys.dm_tran_locks 7 WHERE request_session_id = @@SPID 8 9 COMMIT 10 GO

這一次,SQL Server給我們了下列錯(cuò)誤信息:

因此當(dāng)你使用顯示事務(wù)時(shí),我們要提示SQL Server。但是WITH (SNAPSHOT)SNAPSHOT事務(wù)隔離級(jí)別(Transaction Isolation Level)不一樣,因?yàn)楫?dāng)我更改隔離級(jí)別為SNAPSHOT,并嘗試回滾事務(wù)時(shí):

1 SET TRANSACTION ISOLATION LEVEL SNAPSHOT; 2 BEGIN TRANSACTION 3 4 UPDATE TestTable SET Col2 = 'Test' WHERE Col1 = 1 5 6 ROLLBACK

我會(huì)收到如下的錯(cuò)誤信息:

?

因此,我們給查詢本身加上查詢提示:

1 BEGIN TRANSACTION 2 3 UPDATE TestTable WITH (SNAPSHOT) SET Col2 = 'Test' WHERE Col1 = 1 4 5 SELECT * FROM sys.dm_tran_locks 6 WHERE request_session_id = @@SPID 7 8 COMMIT 9 GO

現(xiàn)在事務(wù)已經(jīng)提交,sys.dm_tran_locks 再一次只顯示了Sch-S鎖。下一步我想做的是嘗試并行執(zhí)行2個(gè)UPDATE語(yǔ)句,但不提交第1個(gè)事務(wù)。因此我們?cè)?個(gè)不同的會(huì)話執(zhí)行下列語(yǔ)句,并確保2個(gè)事務(wù)都不提交。

1 BEGIN TRANSACTION 2 3 UPDATE TestTable WITH (SNAPSHOT) SET Col2 = 'Test' WHERE Col1 = 1

沒(méi)有XTP,第2個(gè)事務(wù)會(huì)阻塞,因?yàn)閄鎖正被第1個(gè)事務(wù)拿著:

很遺憾SQL Server在第2個(gè)會(huì)話里給我們下列的錯(cuò)誤信息:

?

我們的執(zhí)行進(jìn)入更新沖突(Update Conflict),SQL Server回滾了第2個(gè)事務(wù)。我并沒(méi)有料到這點(diǎn),但我需要對(duì)此仔細(xì)思考下。

在當(dāng)前SQL Server 2014 CTP1版本里,XTP提供給你的另一個(gè)東西叫做 本機(jī)編譯的存儲(chǔ)過(guò)程(Natively Compiled Stored Procedures)

?

又一次,沒(méi)有向?qū)?#xff0c;只有你要用到的T-SQL腳本模板。本機(jī)編譯(Native Compilation)意味這SQL Server在后臺(tái)將整個(gè)存儲(chǔ)過(guò)程編譯至C/C++代碼——這個(gè)性能將會(huì)是卓越的,因?yàn)楝F(xiàn)在我們?cè)赟QL Server內(nèi)部直接執(zhí)行本機(jī)代碼(native code)。下面腳本展示了一個(gè)簡(jiǎn)單的XTP存儲(chǔ)過(guò)程是啥樣的:

1 CREATE PROCEDURE HekatonProcedure 2 ( 3 @Param INT 4 ) 5 WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER 6 AS 7 BEGIN 8 ATOMIC WITH 9 ( 10 TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' 11 ) 12 13 INSERT INTO dbo.TestTable (Col1, Col2, Col3) VALUES (@param, N'Woody', N'Tu') 14 15 SELECT Col1, Col2, Col3 FROM dbo.TestTable 16 END 17 GO

有幾個(gè)屬性必須要知道:

  • 存儲(chǔ)過(guò)程必須用SCHEMABINDINGEXECUTE AS來(lái)創(chuàng)建;
  • 存儲(chǔ)過(guò)程必須標(biāo)記為NATIVE_COMPILATION
  • 你必須指定ATOMIC代碼塊,這里設(shè)置事務(wù)隔離級(jí)別和所用語(yǔ)言。

當(dāng)你完成存儲(chǔ)過(guò)程創(chuàng)建后,你就可以執(zhí)行它了:

1 EXEC HekatonProcedure 5 2 GO

因?yàn)楝F(xiàn)在你用的是本機(jī)代碼,那就沒(méi)有執(zhí)行計(jì)劃了!好好享受這執(zhí)行速度……ALTER PROCEDURE也不支持了(沒(méi)意義,因?yàn)槭?strong>本地生成代碼(native generated code)),意味如果你想修改這個(gè)存儲(chǔ)過(guò)程的話,你還不能再次DROPCREATE

這是我第一次安裝SQL Server 2014體驗(yàn)XTP的簡(jiǎn)短過(guò)程。更多的信息和內(nèi)容,我定會(huì)在接下來(lái)的文章里和大家一起分享。請(qǐng)繼續(xù)關(guān)注!

參考文章:

https://www.sqlpassion.at/archive/2013/06/25/first-steps-with-extreme-transaction-processing-hekaton/

總結(jié)

以上是生活随笔為你收集整理的第一次接触终极事务处理——Hekaton的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。