为什么默认情况下关闭快照隔离级别?

时间:2016-01-26 08:57:04

标签: sql-server snapshot-isolation

在MS SQL Server中,为了运行具有SNAPSHOT隔离级别的事务,首先需要在数据库级别打开它。

我只能假设打开此标志会带来DBA需要注意的一些缺点。但我不知道它们是什么。

为什么默认情况下不启用?

PS。注意我不是在讨论READ_COMMITTED_SNAPSHOT隔离级别的READ COMMITTED版本。

2 个答案:

答案 0 :(得分:2)

费用在Choosing Row Versioning-based Isolation Levels页上说明。

有些是:

  
      
  • 当READ_COMMITTED_SNAPSHOT或ALLOW_SNAPSHOT_ISOLATION数据库选项为ON时,即使没有使用基于行版本控制的隔离级别的事务,的更新和删除事务也必须维护行版本 ...

  •   
  • 行版本控制信息需要将14个字节添加到数据库行。

  •   
  • 由于维护行版本所涉及的工作,更新性能可能会变慢......

  •   

还列出了其他费用,但上述内容似乎适用,无论数据库中的任何事务是否实际使用基于行版本控制的级别之一。

答案 1 :(得分:1)

  

启用快照隔离后,每个版本都会更新行版本   事务在tempdb中维护。独特的交易顺序   number标识每个事务,这些唯一的数字是   记录每行版本。

这意味着每个事务基础上有额外的计算和存储开销(簿记),但是通过添加这个额外的负载,可以同时进行更多操作 - 如果它们不发生冲突。这种形式的乐观并发"是指在执行簿记时会产生较小的性能损失,以便在发生碰撞时捕获,此时您必须解除一个或两个交易。但是,如果没有发生冲突,则两个事务都在同一时间完成。

一个糟糕的比喻是假设你有两个单独花费5秒的交易,所以要一个接一个地做,总共需要10秒钟。但是,如果你要在每一个上花费额外的一秒钟,你可以同时做两件事。当然每个人现在花费6秒钟(罚款20%),但总共6秒完成,而不是10秒。

如果您没有真正高水平的并发性,那么使每个事务稍微昂贵可能会浪费资源,因为它会降低您的个人事务吞吐量。因此,在数据库级别进行权衡交易时,DBA会想要考虑这一点,因为它会通过更改存储方式来影响每个事务。