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 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 0000000000000000: 50002c00 01000000 45374139 30303741 2d393531 †P.,…..E7A9007A-951 Version Information = 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) |
こちらが実際に取得できたページ情報になります。
Slot 0, Offset 0x60, Length 122, DumpStyle BYTE Record Type = INDEX_RECORD Record Attributes = VARIABLE_COLUMNS 0000000000000000: 2601007a 00000054 f7310000 00010000 00000000 †&..z…T.1………. |
このページに更新前のデータが格納されています。
[Transaction Timestamp] ですが [トランザクションシーケンス番号 : Transaction Sequence Number (XSN)] と
いう呼ばれかたが一般的だと思います。
この辺の情報は以下の DMV で取得することができます。
sys.dm_tran_version_store |
また、行バージョンは 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 |
この辺をどう組み合わせれば有効な情報が取得できるかというのは考えないといけないのですが、まずはページレベルから見る方法について投稿してみました。