繁体   English   中英

关于SQL Server快照隔离及其使用方法的困惑

[英]Confusion about SQL Server snapshot isolation and how to use it

我是MS Sql Server的新手。 仅有几个月的经验来维护SQL Server SP。 我正在阅读有关优化SP的事务隔离级别的信息,并且感到很困惑。 请帮我解决以下问题:

  1. 如果我在ClientDB中运行DBCC用户选项,则隔离级别的默认值为“已读提交”。 这是否意味着将DB设置为隔离级别,并将其设置为READ_COMMITTED_SNAPSHOT ON?

  2. SET TRANSACTION ISOLATION LEVEL(在事务级别)是否与SET READ_COMMITTED_SNAPSHOT ON(在DB级别)相同? 我的意思是,如果我的数据库启用了SNAPSHOT,那么我可以在SP中设置隔离级别并相应地处理数据吗?

  3. ALLOW_SNAPSHOT_ISOLATION与上述相似吗?

  4. 我有一个SP,它从运行很长时间的SELECT语句开始,该语句还将其内容转储到临时表中。 然后将临时表用于UPDATE / INSERT基表。 大约有8百万条记录被选中并转储到temp表中,然后更新/插入的总行数相近。 我们面临的问题是此SP占用过多的磁盘空间。 这是一个客户端数据库,我们没有权限检查数据库中的磁盘空间/日志大小等。 因此,我不知道tempDB / tempDB日志是否占用了该磁盘空间,或者clientDB / clientDB日志是否占用了该磁盘空间。 但是磁盘空间可以一次减少多达10GB! 这将导致事务日志用完磁盘空间(因为磁盘已满),并且SP错误已耗尽。 如果使用SNAPSHOT隔离级别,此磁盘空间会受到更大的影响吗? 因为它使用tempDB对数据进行版本化?

  5. 我真正想做的是:将事务隔离级别设置为SNAPSHOT。 然后执行SELECT进入Temp表。 然后开始交易并更新/插入基表,例如... 1百万条记录。 在LOOP中执行此操作,直到处理完所有记录。 然后结束交易。 您认为这是个好主意吗? 是否应将初始SELECT排除在TRANSACTION之外? 这是否有助于减少事务日志的负担?

隔离级别“已提交读”与将READ_COMMITTED_SNAPSHOT设置为ON是不同的。 将READ_COMMITTED_SNAPSHOT设置为ON可以设置所有查询的默认隔离级别。 然后使用“读取已提交”隔离级别的查询或过程确实使用快照隔离。 请参阅数据库引擎中的 隔离级别和联机丛书中的SET TRANSACTION ISOLATION LEVEL

将READ_COMMITTED_SNAPSHOT数据库选项设置为ON时,读取提交隔离将使用行版本控制来提供语句级读取一致性。 读操作仅需要SCH-S表级锁,而无需页面或行锁。 当READ_COMMITTED_SNAPSHOT数据库选项设置为OFF(这是默认设置)时,读取提交隔离的行为与在SQL Server的早期版本中相同。 两种实现都符合ANSI定义的读取提交隔离。

ALLOW_SNAPSHOT_ISOLATION不会更改默认隔离级别。 如果需要,它可以让每个查询或过程使用快照隔离。 您要使用快照隔离的每个查询都需要设置TRANSACTION ISOLATION LEVEL SNAPSHOT。 在大型系统上,如果要使用快照隔离,则可能需要这样做,而不是使用READ_COMMITTED_SNAPSHOT更改默认隔离级别。

配置为使用快照隔离的数据库确实会占用更多磁盘空间。

考虑将日志文件移动到更大的磁盘上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM