我是 MS Sql Server 的新手。只需几个月的维护 SQL Server SP 的经验。我正在阅读有关优化 SP 的事务隔离级别,并且很困惑。请帮我解决以下问题:
如果我在 ClientDB 中运行 DBCC 用户选项,隔离级别的默认值是“已提交读”。这是否意味着将数据库设置为隔离级别设置为 READ_COMMITTED_SNAPSHOT ON ?
SET TRANSACTION ISOLATION LEVEL(在事务级别)是否与 SET READ_COMMITTED_SNAPSHOT ON(在 DB 级别)相同?我的意思是如果我的数据库启用了 SNAPSHOT,那么我可以在我的 SP 中设置隔离级别并相应地处理数据吗?
ALLOW_SNAPSHOT_ISOLATION 是否与上述类似?
我有一个 SP,它以一个运行时间很长的 SELECT 语句开始,该语句还将其内容转储到临时表中。然后使用临时表来更新/插入基表。大约有 8 百万条记录被选择并转储到临时表中,然后更新/插入的总行数相似。我们面临的问题是这个SP占用了太多的磁盘空间。它是一个客户端数据库,我们无权检查数据库中的磁盘空间/日志大小等。所以我不知道是 tempDB/tempDB-log 占用了这个磁盘空间还是 clientDB/clientDB-log 占用了这个磁盘空间。但是磁盘空间一次可以减少多达10GB!这会导致事务日志用完磁盘空间(因为磁盘已满)并出现 SP 错误。如果我使用 SNAPSHOT 隔离级别,这个磁盘空间会受到更大的影响吗?因为它使用 tempDB 对数据进行版本化?
我真正想做的是:将事务隔离级别设置为 SNAPSHOT。然后在 Temp 表中执行 SELECT。然后 BEGIN TRANSACTION 并更新/插入基表,例如 ... 1 百万条记录。在循环中执行此操作,直到处理完所有记录。然后结束交易。你认为这是个好主意吗?最初的 SELECT 是否应该被排除在 TRANSACTION 之外?这是否有助于减少事务日志的负载?