RCSI 使用的空间是否比 SNAPSHOT 少或相同?为什么?

Ful*_*oof 7 sql-server transaction tempdb tempdb-version-store snapshot-isolation

试图更好地理解基于行版本控制的事务隔离 - RCSI(读取提交的快照隔离和快照) - 在 SQL Server 中...

MSDN 在线文章“选择基于行版本控制的隔离级别”指出:

  • *“对于大多数应用程序,由于以下原因,建议使用行版本控制读取提交隔离而不是快照隔离:
    • 它比快照隔离消耗更少的 tempdb 空间"*

这与 Kimberly L. Tripp、Neal Graves 的“ SQL Server 2005 Row Versioning-Based Transaction Isolation ”中的陈述相矛盾:

  • “使用行版本控制的读提交中的行版本控制
    对于在使用行版本控制的读提交下运行的查询,行版本仅在事务中每个 SELECT 语句的持续时间内是必需的。但是,行版本会一直保持到事务结束。这是 tempdb 存储需要考虑的重要一点。存储影响将与快照隔离相同。

那么,为什么 RCSI 使用更少(或相同)的空间?

更新:
可能我把最初的问题表述得很糟糕,但这意味着对这两个相互矛盾的“理论”都有 RTFM 解释和确认,我想明白:
哪个是正确的?
为什么一个真的是正确的?

为什么不是另一个真正正确的(为什么是另一种错?)?

子问题:

如果在单个事务中对同一记录进行多次更新,将存储多少个版本?

Jon*_*gel 4

读取已提交快照隔离(语句级快照隔离)可能比快照隔离(事务级快照隔离)使用更少的存储,因为通常行版本在生成后的很长一段时间内都不需要。

对于事务级快照隔离,版本必须在事务的整个持续时间内保持不变,这可能是相当长的时间(或者相当长的时间,如此所示)。当然,语句也可以运行很长时间,但通常事务会花费更长的时间。

强调一点:在快照隔离下运行的事务保证看到事务开始时存在的已提交数据。这意味着必须维护行版本,直到整个事务完成。如果同一事务在 RCSI 下运行,则可能会在每个语句之后释放行版本。总体而言,快照隔离往往会导致比相同工作负载更大的版本存储大小。RCSI

启用其中一个或两个设置时会生成相同的版本。我相信 Kimberly 指的是写入速率意义上的存储影响,而不是使用的存储,因此您提到的两个陈述并不矛盾;只是有点不清楚或不具体。