sys.dm_tran_version_store(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure 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, S0 및 S1 서비스 목표 또는 탄력적 풀 내의 데이터베이스에 대해서는 서버 관리자 계정, 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)