sys.dm_tran_version_store (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

バージョン ストア内のすべてのバージョン レコードを表示する仮想テーブルを返します。 sys.dm_tran_version_storeは、バージョン ストア全体を照会し、バージョン ストアが非常に大きくなる可能性があるため、実行するのは非効率的です。

バージョン管理された各レコードは、一部の追跡または状態情報と共にバイナリ データとして格納されます。 データベース テーブル内のレコードと同様、バージョン ストア レコードは 8,192 バイトのページに格納されます。 レコードが 8,192 バイトを超える場合は、2 つのレコードに分割されます。

バージョン管理されたレコードはバイナリとして格納されるため、異なるデータベースと異なる照合順序に問題はありません。 sys.dm_tran_version_storeを使用して、バージョン ストアに存在するバイナリ表現で以前のバージョンの行を検索します。

構文

sys.dm_tran_version_store  

返されるテーブル

列名 データ型 説明
transaction_sequence_num bigint レコード バージョンを生成するトランザクションのシーケンス番号。
version_sequence_num bigint バージョン レコードのシーケンス番号。 この値は、バージョン生成トランザクション内で一意です。
database_id int バージョン管理されたレコードのデータベース ID。

Azure SQL Database では、値は 1 つのデータベースまたは Elastic Pool 内で一意ですが、論理サーバー内では一意ではありません。
rowset_id bigint レコードの行セット ID。
status tinyint バージョン管理されたレコードが 2 つのレコードに分割されているかどうかを示します。 値が 0 の場合、レコードは 1 ページに格納されています。 値が 1 の場合、レコードは 2 つの異なるページに格納される 2 つのレコードに分割されます。
min_length_in_bytes smallint レコードの最小長 (バイト単位)。
record_length_first_part_in_bytes smallint バージョン レコードの最初の部分の長さ (バイト単位)。
record_image_first_part varbinary(8000) バージョン レコードの最初の部分のバイナリ イメージ。
record_length_second_part_in_bytes smallint バージョン レコードの 2 番目の部分の長さ (バイト単位)。
record_image_second_part varbinary(8000) バージョン レコードの 2 番目の部分のバイナリ イメージ。

アクセス許可

SQL Server と SQL Managed Instance では、VIEW SERVER STATE アクセス許可が必要です。

SQL Database Basic、S0、S1 サービス目標、およびエラスティック プール内のデータベースの場合、サーバー管理者アカウント、Microsoft Entra 管理者アカウント、またはサーバー ロール##MS_ServerStateReader##メンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE アクセス許可または ##MS_ServerStateReader## サーバー ロールのメンバーシップのいずれかが必要です。

SQL Server 2022 以降でのアクセス許可

サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。

次の例では、4 つの同時実行トランザクションが存在するテスト シナリオを使用します。これらのトランザクションはそれぞれトランザクション シーケンス番号 (XSN) で識別され、ALLOW_SNAPSHOT_ISOLATION オプションと READ_COMMITTED_SNAPSHOT オプションが ON に設定されているデータベース内で実行されます。 実行されるトランザクションは次のとおりです。

  • XSN-57。SERIALIZABLE 分離での更新操作です。

  • XSN-58 は XSN-57 と同じです。

  • XSN-59 は、スナップショット分離での選択操作です。

  • XSN-60 は XSN-59 と同じです。

次のクエリが実行されます。

SELECT  
    transaction_sequence_num,  
    version_sequence_num,  
    database_id rowset_id,  
    status,  
    min_length_in_bytes,  
    record_length_first_part_in_bytes,  
    record_image_first_part,  
    record_length_second_part_in_bytes,  
    record_image_second_part  
  FROM sys.dm_tran_version_store;  

結果セットは次のようになります。

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  

この出力は、XSN-57 で 1 つのテーブルから 3 つの行バージョンが作成され、XSN-58 で他のテーブルから 1 つの行バージョンが作成されたことを示しています。

参照

動的管理ビューと動的管理関数 (Transact-SQL)
トランザクション関連の動的管理ビューおよび関数 (Transact-SQL)