原文來(lái)自:
http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/
前面幾篇博文已經(jīng)初步介紹了版本存儲(chǔ)區(qū),現(xiàn)在我們來(lái)了解一下它的邏輯結(jié)構(gòu),看看它究竟是如何儲(chǔ)存不同結(jié)構(gòu)的表格和索引行的。其實(shí)我們只要看一下
DMV
sys.dm_tran_version_store
這個(gè)DMV就夠了
.
這個(gè)DVM視圖顯示了版本存儲(chǔ)區(qū)全部邏輯結(jié)構(gòu)。有兩點(diǎn)值得注意。第一,版本存儲(chǔ)區(qū)也和數(shù)據(jù)頁(yè)面索引頁(yè)面一樣由8k大小的頁(yè)組成。這些頁(yè)存在緩沖池中,可以在TempDB面臨內(nèi)存壓力時(shí)被寫(xiě)入磁盤(pán)。第二,版本存儲(chǔ)區(qū)存儲(chǔ)的是完整的二進(jìn)制文件,就像在數(shù)據(jù)頁(yè)存儲(chǔ)的一樣。這種二進(jìn)制文件分為前后兩個(gè)部分,然后在SQL
Server內(nèi)部會(huì)對(duì)其進(jìn)行組合。這使得行版本存儲(chǔ)獨(dú)立于它所屬的對(duì)象的架構(gòu),即一個(gè)儲(chǔ)存區(qū)的頁(yè)可以存儲(chǔ)來(lái)自不同表不同索引的行,甚至可能來(lái)自同一實(shí)例下的不同數(shù)據(jù)庫(kù)。換句話說(shuō),版本存儲(chǔ)區(qū)是一個(gè)SQL
Server實(shí)例下公用的。和數(shù)據(jù)頁(yè)和索引頁(yè)一樣,在內(nèi)存緊張的時(shí)候版本存儲(chǔ)頁(yè)也會(huì)從緩沖池中被清除。
如果查看名為
sys.dm_tran_version_store
的DMV會(huì)發(fā)現(xiàn),我們會(huì)發(fā)現(xiàn)版本行有很多原始數(shù)據(jù)或索引頁(yè)面所沒(méi)有的的新屬性,如database-id,行長(zhǎng)度等。您可能會(huì)問(wèn),行版本同樣受到SQL
Server最大行長(zhǎng)度8060的限制,那么它是如何存儲(chǔ)原始數(shù)據(jù)行(最大行長(zhǎng)度也是8060)并增長(zhǎng)新屬性的呢。答案是,數(shù)據(jù)行在版本存儲(chǔ)頁(yè)實(shí)際上被分成了2行,只是在DMV視圖中表現(xiàn)成一大行。
下面是一個(gè)版本存儲(chǔ)的例子。事務(wù)57已經(jīng)更新了三個(gè)不同的行,同時(shí)事務(wù)58只更新1行內(nèi)容。請(qǐng)注意,如果一個(gè)事務(wù)中多次更新同一行,只會(huì)創(chuàng)建一個(gè)行版本,因?yàn)閷?duì)其他事務(wù)來(lái)說(shuō),它從一開(kāi)始就持有了X鎖。
transaction_sequence_num
version_sequence_num database_id
------------------------
-------------------- -----------
57????????????????????? 1??????????????????? 9??????????
57????????????????????? 2??????????????????? 9??????????
57????????????????????? 3??????????????????? 9??????????
58????????????????????? 1??????????????????? 9??????????
?
rowset_id??????????? status min_length_in_bytes
--------------------
------ -------------------
72057594038321152??? 0?????
12??????????? ?????
72057594038321152??? 0?????
12????????????????
72057594038321152??? 0?????
12????????????????
72057594038386688??? 0?????
16????????????????
?
record_length_first_part_in_bytes
---------------------------------
29??????????????????????????????
29??????????????????????????????
29??????????????????????????????
33??????????????????????????????
?
record_image_first_part????????????????????????????????????????????
--------------------------------------------------------------------
0x50000C0073000000010000000200FCB000000001000000270000000000???????
0x50000C0073000000020000000200FCB000000001000100270000000000???????
0x50000C0073000000030000000200FCB000000001000200270000000000???????
0x500010000100000002000000030000000300F800000000000000002E0000000000
?
record_length_second_part_in_bytes??? record_image_second_part
----------------------------------
----------------------
0????????????????????????????????? NULL
0????????????????????????????????? NULL
0????????????????????????????????? NULL
0????? ????????????????????????????NULL
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
