在 MS SQL Server 中,为了运行具有SNAPSHOT隔离级别的事务,首先需要在数据库级别打开它。
我只能假设打开这个标志会带来一些 DBA 需要注意的缺点。但我不知道它们是什么。
为什么默认不开启?
PS。注意我不是在谈论隔离级别的READ_COMMITTED_SNAPSHOT
版本。READ COMMITTED
在 MS SQL Server 中,为了运行具有SNAPSHOT隔离级别的事务,首先需要在数据库级别打开它。
我只能假设打开这个标志会带来一些 DBA 需要注意的缺点。但我不知道它们是什么。
为什么默认不开启?
PS。注意我不是在谈论隔离级别的READ_COMMITTED_SNAPSHOT
版本。READ COMMITTED
成本在选择基于行版本控制的隔离级别页面上进行了描述。
有些是:
当 READ_COMMITTED_SNAPSHOT 或 ALLOW_SNAPSHOT_ISOLATION 数据库选项为 ON 时,特定数据库的更新和删除事务必须维护行版本,即使没有使用基于行版本控制的隔离级别的事务...
行版本信息需要向数据库行添加 14 个字节。
由于维护行版本所涉及的工作,更新性能可能会变慢...
还列出了其他成本,但以上似乎适用,无论数据库中的任何事务实际上是否使用基于行版本控制的级别之一。
启用快照隔离后,每个事务的更新行版本都会在 tempdb 中维护。唯一的事务序列号标识每个事务,并且为每个行版本记录这些唯一编号。
这意味着在每个事务(簿记)的基础上存在额外的计算和存储开销,但是通过添加这个额外的负载,更多的操作可以同时进行——如果它们不冲突的话。这种形式的“乐观并发”是一种在执行簿记时会产生小的性能损失,让您可以在发生碰撞时捕捉到,此时您必须解除一个或两个事务。但是,如果没有发生冲突,那么两个事务会同时进行。
一个糟糕的类比是假设您有两个单独需要 5 秒的事务,因此一个接一个地执行它们总共需要 10 秒。但是,如果你要在每一个上多花一秒钟,你可以同时做这两个。当然现在每个都需要 6 秒(20% 的惩罚),但两者都在 6 秒内完成,而不是 10 秒。
如果您没有真正高水平的并发性,使每个事务稍微贵一点可能会浪费资源,因为它会降低您的单个事务吞吐量。因此,当您在数据库级别权衡启用时,您的 DBA 需要考虑这一点,因为它通过更改存储方式来影响每个事务。