原文來自:
http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/
前面幾篇博文已經初步介紹了版本存儲區,現在我們來了解一下它的邏輯結構,看看它究竟是如何儲存不同結構的表格和索引行的。其實我們只要看一下
DMV
sys.dm_tran_version_store
這個DMV就夠了
.
這個DVM視圖顯示了版本存儲區全部邏輯結構。有兩點值得注意。第一,版本存儲區也和數據頁面索引頁面一樣由8k大小的頁組成。這些頁存在緩沖池中,可以在TempDB面臨內存壓力時被寫入磁盤。第二,版本存儲區存儲的是完整的二進制文件,就像在數據頁存儲的一樣。這種二進制文件分為前后兩個部分,然后在SQL
Server內部會對其進行組合。這使得行版本存儲獨立于它所屬的對象的架構,即一個儲存區的頁可以存儲來自不同表不同索引的行,甚至可能來自同一實例下的不同數據庫。換句話說,版本存儲區是一個SQL
Server實例下公用的。和數據頁和索引頁一樣,在內存緊張的時候版本存儲頁也會從緩沖池中被清除。
如果查看名為
sys.dm_tran_version_store
的DMV會發現,我們會發現版本行有很多原始數據或索引頁面所沒有的的新屬性,如database-id,行長度等。您可能會問,行版本同樣受到SQL
Server最大行長度8060的限制,那么它是如何存儲原始數據行(最大行長度也是8060)并增長新屬性的呢。答案是,數據行在版本存儲頁實際上被分成了2行,只是在DMV視圖中表現成一大行。
下面是一個版本存儲的例子。事務57已經更新了三個不同的行,同時事務58只更新1行內容。請注意,如果一個事務中多次更新同一行,只會創建一個行版本,因為對其他事務來說,它從一開始就持有了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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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