Preskočiť na obsah
Skript

Version store – kto ho drží

Koľko miesta v tempdb zaberá version store (RCSI, snapshot, online index rebuild, triggre), ktorá databáza ho generuje a ktorá najstaršia snapshot transakcia bráni jeho čisteniu. Na 2019+ aj ADR persistent version store.

version-store-kto-ho-drzi.sql 64 riadkov · T-SQL
Parametre skriptu doplň a kopíruj hotový skript
/* DeadlockCafe | Version store – kto ho drží
   Účel:  Koľko miesta v tempdb zaberá version store (RCSI, snapshot, online index rebuild, triggre), ktorá databáza ho generuje a ktorá najstaršia snapshot transakcia bráni jeho čisteniu. Na 2019+ aj ADR persistent version store.
   Režim: READ ONLY | SQL Server 2016 – 2022 (sada 2 od 2016 SP2, sada 4 od 2019), on-premises
*/
SET NOCOUNT ON;

DECLARE @major int = CONVERT(int, SERVERPROPERTY('ProductMajorVersion'));
DECLARE @build int = CONVERT(int, PARSENAME(CONVERT(varchar(50), SERVERPROPERTY('ProductVersion')), 2));

-- 1) version store v tempdb celkovo
SELECT CAST(SUM(version_store_reserved_page_count) * 8.0 / 1024 AS decimal(18,1)) AS version_store_mb,
       CAST(SUM(unallocated_extent_page_count)     * 8.0 / 1024 AS decimal(18,1)) AS tempdb_free_mb
FROM tempdb.sys.dm_db_file_space_usage;

-- 2) podľa databázy – sys.dm_tran_version_store_space_usage existuje od 2016 SP2 (13.0.5026)
IF @major > 13 OR (@major = 13 AND @build >= 5026)
    EXEC (N'SELECT DB_NAME(database_id) AS database_name,
                   CAST(reserved_space_kb / 1024.0 AS decimal(18,1)) AS version_store_mb,
                   reserved_page_count
            FROM sys.dm_tran_version_store_space_usage
            WHERE reserved_page_count > 0
            ORDER BY reserved_space_kb DESC;');
ELSE
    PRINT N'sys.dm_tran_version_store_space_usage vyžaduje SQL Server 2016 SP2 alebo novší – sada 2 preskočená.';

-- 3) najstaršie snapshot transakcie (držia verzie)
SELECT TOP (20)
       a.session_id,
       a.transaction_id,
       a.elapsed_time_seconds,
       a.is_snapshot,
       a.max_version_chain_traversed,
       a.average_version_chain_traversed,
       s.status                 AS session_status,
       s.login_name, s.host_name, s.program_name,
       s.open_transaction_count,
       DB_NAME(s.database_id)   AS session_database,
       r.command, r.wait_type,
       ib.event_info            AS last_submitted_command
FROM sys.dm_tran_active_snapshot_database_transactions AS a
LEFT JOIN sys.dm_exec_sessions AS s ON s.session_id = a.session_id
LEFT JOIN sys.dm_exec_requests AS r ON r.session_id = a.session_id
OUTER APPLY sys.dm_exec_input_buffer(a.session_id, NULL) AS ib
ORDER BY a.elapsed_time_seconds DESC;

-- 4) ADR persistent version store (SQL Server 2019+)
IF @major >= 15
    EXEC (N'SELECT DB_NAME(p.database_id) AS database_name,
                   CAST(p.persistent_version_store_size_kb / 1024.0 AS decimal(18,1))   AS pvs_mb,
                   CAST(p.online_index_version_store_size_kb / 1024.0 AS decimal(18,1)) AS online_index_vs_mb,
                   p.current_aborted_transaction_count,
                   p.oldest_active_transaction_id,
                   at.transaction_begin_time AS oldest_active_tran_begin,
                   st.session_id             AS oldest_active_tran_session,
                   p.oldest_aborted_transaction_id,
                   p.offrow_version_cleaner_start_time,
                   p.offrow_version_cleaner_end_time
            FROM sys.dm_tran_persistent_version_store_stats AS p
            JOIN sys.databases AS d ON d.database_id = p.database_id
            LEFT JOIN sys.dm_tran_active_transactions AS at ON at.transaction_id = p.oldest_active_transaction_id
            LEFT JOIN sys.dm_tran_session_transactions AS st ON st.transaction_id = p.oldest_active_transaction_id
            WHERE d.is_accelerated_database_recovery_on = 1
            ORDER BY p.persistent_version_store_size_kb DESC;');
## Kedy použiť

Keď rastie tempdb a recept Kto spotrebúva tempdb neukazuje žiadnu session s veľkými #temp tabuľkami, pri zapnutom RCSI / SNAPSHOT isolation alebo pri raste databázy so zapnutým ADR.

## Ako čítať výsledok

Sada 1: celková veľkosť version store a voľné miesto v tempdb. Sada 2 (2016 SP2+): version store podľa databázy, ktorá verzie generuje. Sada 3: najstaršie aktívne snapshot transakcie – `elapsed_time_seconds` = ako dlho drží verzie; kým beží, version store sa nedá vyčistiť. `session_status = sleeping` + otvorená transakcia = aplikácia zabudla COMMIT. Sada 4 (2019+, len databázy s ADR): veľkosť PVS **v používateľskej databáze** a najstaršia aktívna transakcia, ktorá bráni jeho čisteniu.

> [!WARNING]
> Version store čistí background proces približne raz za minútu – po skončení transakcie neklesne hneď. Sada 3 ukazuje len transakcie, ktoré verzie **čítajú** (snapshot / RCSI); verzie môže držať aj dlhá transakcia, ktorá ich len generuje – porovnaj s receptom Otvorené transakcie. Na SQL Server 2016 bez SP2 sa sada 2 preskočí.

**Oprávnenia:** `VIEW SERVER STATE` (na SQL Server 2022 stačí `VIEW SERVER PERFORMANCE STATE`).  
**Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022 (sada 2 od 2016 SP2, sada 4 od 2019)

## Súvisiace recepty

- [Kto spotrebúva tempdb](script.php?id=20&s=kto-spotrebuva-tempdb)
- [Otvorené transakcie – kto ich drží a ako dlho](script.php?id=15&s=otvorene-transakcie-kto-ich-drzi-a-ako-dlho)
- [Konfigurácia tempdb – súbory, veľkosť, autogrowth](script.php?id=13&s=konfiguracia-tempdb-subory-velkost-autogrowth)
- [Inventár databáz – recovery model, compat level, RCSI](script.php?id=12&s=inventar-databaz-recovery-model-compat-level-rcsi)

## Zdroje

- [sys.dm_tran_version_store_space_usage](https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-version-store-space-usage)
- [sys.dm_tran_active_snapshot_database_transactions](https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-active-snapshot-database-transactions-transact-sql)
- [sys.dm_tran_persistent_version_store_stats](https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-persistent-version-store-stats)
- [sys.dm_db_file_space_usage](https://learn.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-file-space-usage-transact-sql)

_Skript je staticky overený proti dokumentácii Microsoft Learn (názvy DMV, stĺpcov a hodnôt), nie spustený na živom serveri. Pred použitím na PROD ho vyskúšaj na TEST._