-1

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

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

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

  3. ALLOW_SNAPSHOT_ISOLATION 是否与上述类似?

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

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

4

1 回答 1

1

“已提交读”的隔离级别与将 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 不会更改默认隔离级别。如果您愿意,它允许每个查询或过程使用快照隔离。每个要使用快照隔离的查询都需要 SET TRANSACTION ISOLATION LEVEL SNAPSHOT。在大型系统上,如果您想使用快照隔离,您可能需要这样做,而不是使用 READ_COMMITTED_SNAPSHOT 更改默认隔离级别。

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

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

于 2013-05-21T11:14:42.800 回答