关于行版本控制的一些知识
1.行版本的生成和删除
只要活动事务需要访问行版本,就必须存储行版本。后台线程每隔一分钟删除一次不再需要的行版本,从而释放 tempdb 中的版本空间。如果长时间运行的事务符合下列任何一种条件,则会阻止释放版本存储区中的空间:
-
使用基于行版本控制的隔离。
-
使用触发器、MARS 或联机索引生成操作。
-
生成行版本
以下是英文原文:
Row versions must be stored for as long as an active transaction needs to access it. Once every minute, a background thread removes row versions that are no longer needed and frees up the version space in tempdb. A long-running transaction prevents space in the version store from being released if it meets any of the following conditions:
-
It uses row versioning-based isolation.
-
It uses triggers, MARS, or online index build operations.
-
It generates row versions.
2.行版本存储
-
行版本在活动事务必须对其进行访问时一直保存在 tempdb 版本存储区中。当前版本存储区的内容在 sys.dm_tran_version_store 中返回。由于版本存储区页是全局资源,所以在文件级别对其进行跟踪。您可以使用 sys.dm_db_file_space_usage 中的 version_store_reserved_page_count 列来查看版本存储区的当前大小。版本存储区清除必须考虑需要访问特定版本的运行时间最长的事务。可通过查看 sys.dm_tran_active_snapshot_database_transactions 中的 elapsed_time_seconds 列来发现与版本存储区清除相关的运行时间最长的事务。可以使用 Transactions 对象中的 Free Space in Tempdb (KB) 和 Version Store Size (KB) 计数器来监视 tempdb 中行版本存储区的大小和增长速率。有关详细信息,请参阅 SQL Server Transactions 对象。
若要估计 tempdb 中行版本控制所需的空间量,请务必先考虑活动事务必须将其所有更改保留在版本存储区中。这意味着稍后启动的快照事务可以访问旧版本。此外,如果存在活动的快照事务,则由快照启动时处于活动状态的事务生成的所有版本存储区数据也必须保留。
下面是基本公式:
[Size of Version Store] = 2 *
[Version store data generated per minute] *
[Longest running time (minutes) of your transaction]