【发布时间】:2021-07-06 11:58:17
【问题描述】:
使用读提交的快照隔离,提交后行版本会发生什么?
它是永久存储在 tempdp 中,还是在某个时候被删除?
以及如何判断这会增加多少 tempdp 大小?
【问题讨论】:
标签: sql sql-server concurrency isolation-level
使用读提交的快照隔离,提交后行版本会发生什么?
它是永久存储在 tempdp 中,还是在某个时候被删除?
以及如何判断这会增加多少 tempdp 大小?
【问题讨论】:
标签: sql sql-server concurrency isolation-level
没有任何东西永久存储在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());
【讨论】: