SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

行のバージョン管理をページ情報から確認してみる

leave a comment

DBCC PAGE でいろいろな情報を見ていく当ブログですが、今回は行のバージョン管理 (RLV : Row Level Versioning) についてみていきたいと思います。

■DBCC PAGE で行のバージョン管理を確認


SQL Server で行のバージョン管理というと [READ COMMITTED SNAPSHOT 分離 (Read Committed Snapshot Isolation : RCSI)] と [スナップショット分離レベル] が思い浮かぶかと思います。

これらを使用すると、データを更新している最中でも一貫性のあるデータの読み取りを実現することが可能となります。
# NOLOCK ロックヒントの場合はダーティーページの読み取りとなり、未コミットのデータ (更新後にロールバックされる可能性がある) の読み取りを行うので一貫性があるとはいうことができません。

これらの機能を有効にする場合には以下のクエリを実行してデータベースレベルで設定を変更します。

ALTER DATABASE [TEST] SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE [TEST] SET ALLOW_SNAPSHOT_ISOLATION ON

 

行バージョンを使用するスナップショット (READ COMMITTED SNAPSHOT 分離] [スナップショット分離レベル]) を有効にする前は、行の情報は以下のようになっています。

Slot 0 Offset 0x60 Length 47

Record Type = PRIMARY_RECORD        Record Attributes =  NULL_BITMAP    Record Size = 47

Memory Dump @0x000000002ED3A060

0000000000000000:   10002c00 01000000 31314346 41384533 2d374243 †..,…..11CFA8E3-7BC
0000000000000014:   312d3435 39422d41 3134392d 38364644 32303732 †1-459B-A149-86FD2072
0000000000000028:   42333233 020000†††††††††††††††††††††††††††††††B323…

Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4

Col1 = 1                           

Slot 0 Column 2 Offset 0x8 Length 36 Length (physical) 36

Col2 = 11CFA8E3-7BC1-459B-A149-86FD2072B323                             

Slot 0 Offset 0x0 Length 0 Length (physical) 0

KeyHashValue = (8194443284a0)

 

スナップショットを有効にすると行の情報は以下のように変更されます。

Slot 0 Offset 0x60 Length 61

Record Type = PRIMARY_RECORD        Record Attributes =  NULL_BITMAP VERSIONING_INFO
Record Size = 61                   
Memory Dump @0x000000002E95A060

0000000000000000:   50002c00 01000000 45374139 30303741 2d393531 †P.,…..E7A9007A-951
0000000000000014:   432d3445 46442d39 4239362d 45304535 46453739 †C-4EFD-9B96-E0E5FE79
0000000000000028:   39313036 02000060 00000005 00000054 f7310000 †9106…`…….T.1..
000000000000003C:   00††††††††††††††††††††††††††††††††††††††††††††.     

Version Information =
    Transaction Timestamp: 3274580
    Version Pointer: (file 5 page 96 currentSlotId 0)

Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4

Col1 = 1                           

Slot 0 Column 2 Offset 0x8 Length 36 Length (physical) 36

Col2 = E7A9007A-951C-4EFD-9B96-E0E5FE799106                             

Slot 0 Offset 0x0 Length 0 Length (physical) 0

KeyHashValue = (8194443284a0)      

行のバージョン管理を使用する機能を有効にすると、行情報に [Version Information] と行のバージョン管理についての 14 バイトの情報が追加されます。

行のバージョン情報ですが、スナップショットの機能を有効にすると取得がされるようになります。
Version Pointer は行のバージョン管理で使用している tempdb のページ情報を指しています。
上記の結果であれば、更新前のデータが [tempdb] の [ファイル 5] [ページ 96] [スロット 0] に格納されているということになります。
DBCC PAGE で確認をする場合は以下のクエリになります。

DBCC TRACEON(3604)
DBCC PAGE(N’tempdb’, 5, 96, 1)
DBCC TRACEOFF(3604)

こちらが実際に取得できたページ情報になります。

Slot 0, Offset 0x60, Length 122, DumpStyle BYTE

Record Type = INDEX_RECORD          Record Attributes =  VARIABLE_COLUMNS
Record Size = 122                  
Memory Dump @0x000000002E95A060

0000000000000000:   2601007a 00000054 f7310000 00010000 00000000 †&..z…T.1……….
0000000000000014:   00050000 00000000 00000016 00000000 012c0000 †……………..,..
0000000000000028:   00000000 00b02200 00000000 00000095 2e000000 †…..°"………….
000000000000003C:   0050002c 00010000 00383341 30333534 342d3730 †.P.,…..83A03544-70
0000000000000050:   37462d34 3046312d 41434439 2d304245 35413439 †7F-40F1-ACD9-0BE5A49
0000000000000064:   33314336 39020000 50000000 05000000 53f73100 †31C69…P…….S.1.
0000000000000078:   0000††††††††††††††††††††††††††††††††††††††††††..    

このページに更新前のデータが格納されています。

[Transaction Timestamp] ですが [トランザクションシーケンス番号 : Transaction Sequence Number (XSN)] という呼ばれかたが一般的だと思います。
この辺の情報は以下の DMV で取得することができます。

sys.dm_tran_version_store
sys.dm_tran_current_transaction
sys.dm_tran_active_snapshot_database_transactions
sys.dm_tran_top_version_generators

また、行バージョンは tempdb に格納がされるのですが、どの程度行バージョンで tempdb を使用しているかは、以下の DMV で確認することができます。
Denali の場合は、tempdb 以外も sys.dm_db_file_space_usage の情報が一部取得することができるようになっています。
そのため、tempdb の sys.dm_db_file_space_usage を確認するために DB 名を修飾しています。

tempdb.sys.dm_db_file_space_usage

この辺をどう組み合わせれば有効な情報が取得できるかというのは考えないといけないのですが、まずはページレベルから見る方法について投稿してみました。

Written by masayuki.ozawa

4月 24th, 2011 at 10:50 pm

Posted in SQL Server

Tagged with

Leave a Reply

*