相关疑难解决方法(0)

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

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

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

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

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

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

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

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

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

子问题:

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

sql-server transaction tempdb tempdb-version-store snapshot-isolation

7
推荐指数
1
解决办法
284
查看次数

查找填满版本存储的事务

我们为一些 SQL Server 2005 数据库启用了“READ_COMMITTED_SNAPSHOT”。

现在我们不时看到我们的 TempDB 正在填满硬盘,我们怀疑版本存储是罪魁祸首。

我们监视 TempDB 的使用情况sys.dm_db_file_space_usage,一旦我们看到版本存储在增加(如 所报告的那样 version_store_reserved_page_count),我们希望识别正在使用版本存储的事务。

我正在使用以下语句来查找使用版本存储的事务:

SELECT db_name(spu.database_id) as database_name,
       at.transaction_begin_time as begin_time,
       case 
         when at.transaction_state in (0,1) then 'init'
         when at.transaction_state = 2 then 'active'
         when at.transaction_state = 3 then 'ended'
         when at.transaction_state = 4 then 'committing'
         when at.transaction_state = 6 then 'comitted'
         when at.transaction_state = 7 then 'rolling back'
         when at.transaction_state = 6 then 'rolled back'
         else 'other'
       end as transaction_state,
       ast.elapsed_time_seconds as elapsed_seconds,
       ses.program_name, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server tempdb tempdb-version-store

6
推荐指数
1
解决办法
1万
查看次数