SQL Server中TempDB管理(version store的邏輯結構)

發糞塗牆發表於2012-06-07

原文來自:

http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/

http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/31/managing-tempdb-in-sql-server-tempdb-basics-version-store-logical-structure.aspx

前面幾篇博文已經初步介紹了版本儲存區,現在我們來了解一下它的邏輯結構,看看它究竟是如何儲存不同結構的表格和索引行的。其實我們只要看一下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

相關文章