对不起,我的英语不好 :)
我需要了解版本存储清理的帮助。我有以下情况。
- 12:00 在快照隔离级别下启动一条 select 语句,不提交。
- 12:01 在读已提交隔离级别下启动更新语句(更新单行)并提交。
- 12:02 在快照隔离级别下启动一个 select 语句并且不提交。
- 12:03 在read committed隔离级别下启动更新语句(更新单行)并提交。
现在,如果我们查看版本存储,例如
从 sys.dm_tran_version_store 选择 *
我们将看到 2 行(每个更新语句一行)。
现在,如果我们提交从 12:00 开始的第一个事务,则不会从版本存储中删除任何行(甚至过了一分钟)。
问题是为什么???.
在我看来,必须从版本存储中删除行,因为没有任何活动事务必须访问该版本。
我也尝试更新没有 1 行,但是 100 行(总计超过 100 KB)但我有同样的情况,版本存储没有被删除。
请帮助我了解版本存储何时清理。非常感谢您的帮助。
版本行被垃圾回收的最低条件是当 SQL Server 根据事务状态确定不再需要该版本时。
另外,参考我的 SQL Server 内部笔记,对于版本存储的管理,SQL Server 将每分钟执行一次定期清理,并使用后台进程从版本存储中回收所有可重用空间。
Version generation rate and version cleanup rate
您可以在perfmon 计数器中进行监视,SQLServer:Transactions
以找出以 KB/秒为单位的版本存储获取和释放空间的速率。检查:在 SQL Server 中管理 TempDB:TempDB 基础知识(版本存储:简单示例)