sys.dm_tran_version_store(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

버전 저장소의 모든 버전 레코드를 표시하는 가상 테이블을 반환합니다. sys.dm_tran_version_store 전체 버전 저장소를 쿼리하고 버전 저장소가 매우 클 수 있으므로 실행하기가 비효율적입니다.

버전이 지정된 각 레코드는 일부 추적 또는 상태 정보와 함께 이진 데이터로 저장됩니다. 데이터베이스 테이블의 레코드와 마찬가지로 버전 저장소 레코드도 8192바이트 페이지로 저장됩니다. 레코드가 8192바이트를 초과하면 레코드가 서로 다른 두 레코드로 분할됩니다.

버전이 지정된 레코드는 이진으로 저장되므로 서로 다른 데이터베이스의 데이터 정렬에 문제가 없습니다. 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에서 값은 단일 데이터베이스 또는 탄력적 풀 내에서 고유하지만 논리 서버 내에는 없습니다.
rowset_id bigint 레코드의 행 집합 ID입니다.
status tinyint 버전이 지정된 레코드가 두 레코드 간에 분할되었는지 여부를 나타냅니다. 값이 0이면 레코드가 한 페이지에 저장됩니다. 값이 1이면 레코드가 두 개 레코드로 분할되어 서로 다른 두 페이지에 저장됩니다.
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 버전 레코드의 두 번째 부분 길이(바이트)입니다.
record_image_second_part varbinary(8000) 버전 레코드의 두 번째 부분의 이진 이미지입니다.

사용 권한

SQL Server 및 SQL Managed Instance에서는 VIEW SERVER STATE 권한이 필요합니다.

SQL Database Basic, S0S1 서비스 목표 및 탄력적 풀의 데이터베이스에는 서버 관리자 계정, Microsoft Entra 관리자 계정 또는 서버 역할##MS_ServerStateReader##멤버 자격이 필요합니다. 다른 모든 SQL Database 서비스 목표에 대해서는 데이터베이스에 대한 VIEW DATABASE STATE 권한 또는 ##MS_ServerStateReader## 서버 역할의 멤버 자격이 필요합니다.

SQL Server 2022 이상에 대한 권한

서버에 대한 VIEW SERVER PERFORMANCE STATE 권한이 필요합니다.

예제

다음 예에서는 ALLOW_SNAPSHOT_ISOLATION 및 READ_COMMITTED_SNAPSHOT 옵션이 ON으로 설정된 데이터베이스에서 각각 XSN(트랜잭션 시퀀스 번호)으로 식별되는 4개의 동시 트랜잭션이 실행되는 테스트 시나리오를 사용합니다. 다음 트랜잭션이 실행 중입니다.

  • XSN-57은 직렬화 가능한 격리에서 업데이트 작업입니다.

  • 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이 한 테이블에서 행 버전 3개를 만들었으며 XSN-58이 다른 테이블에서 행 버전 하나를 만들었음을 보여 줍니다.

참고 항목

동적 관리 뷰 및 함수(Transact-SQL)
트랜잭션 관련 동적 관리 뷰 및 함수(Transact-SQL)