【问题标题】:With read committed snapshot isolation, what happens to the version after the commit使用读提交的快照隔离,提交后的版本会发生什么
【发布时间】:2021-07-06 11:58:17
【问题描述】:

使用读提交的快照隔离,提交后行版本会发生什么?

它是永久存储在 tempdp 中,还是在某个时候被删除?

以及如何判断这会增加多少 tempdp 大小?

【问题讨论】:

    标签: sql sql-server concurrency isolation-level


    【解决方案1】:

    没有任何东西永久存储在tempdb 中,如果是,它会继续增长,直到填满可用空间,这当然是不可取的。

    行将保留在版本存储中,直到创建它们的事务完成并且引用已修改数据的任何事务也完成。如果是引用版本的select,则在语句完成后将其删除。该版本被标记为准备就绪,实际的清理工作由单独的进程处理。

    SQL Server 维护一个清理线程,以确保它不会将版本化的行保留的时间超过所需的时间,该线程每分钟运行一次,并从版本存储中回收所有可重用空间。

    如果tempdb 真的用完了可用空间,SQL Server 会调用清理函数并增加文件的大小,假设它被配置为自动增长;如果tempdb 文件无法增长,则不会生成更多版本,任何需要读取该版本的查询都将失败。

    存在许多性能计数器和元数据来监控 tempdb 的 RSCI 使用情况

    sys.dm_tran_version_store 包含有关当前在版本存储中的所有行的信息。这里的行数count 反映了所有当前 RSCI 事务的行数。名为transaction_sequence_number 的列包含每个新事务的始终递增的序列号。

    您可以获取有关当前运行事务的连接的信息

    select  
        t.transaction_sequence_num,
        t.commit_sequence_num,
        t.is_snapshot,
        t.session_id,
        t.first_snapshot_sequence_num,
        t.max_version_chain_traversed,
        t.elapsed_time_seconds,
        s.host_name,
        s.login_name,
        s.transaction_isolation_level
    from sys.dm_tran_active_snapshot_database_transactions t
        join sys.dm_exec_sessions s on t.session_id = s.session_id;
    

    您可以获取有关tempdb using 的使用情况和空间消耗的信息

    select
        Db_Name(vsu.database_id) as DatabaseName,
        vsu.reserved_page_count, 
        vsu.reserved_space_kb, 
        tu.total_page_count as tempdb_pages, 
        vsu.reserved_page_count * 100. / tu.total_page_count as [Snapshot %],
        tu.allocated_extent_page_count * 100. / tu.total_page_count as [tempdb % used]
    from sys.dm_tran_version_store_space_usage vsu
    cross join tempdb.sys.dm_db_file_space_usage tu
    where vsu.database_id = Db_Id(Db_Name());
    

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 2020-01-08
      • 2014-01-03
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      相关资源
      最近更新 更多