Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于SQL Server快照隔离以及如何使用它的混淆_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

关于SQL Server快照隔离以及如何使用它的混淆

关于SQL Server快照隔离以及如何使用它的混淆,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我是微软Sql Server的新手。只有几个月的SQL Server SPs维护经验。我正在阅读有关优化SP的事务隔离级别的信息,对此感到非常困惑。请帮我回答以下问题: 如果在ClientDB中运行DBCC useroptions,隔离级别的默认值为“read committed”。这是否意味着数据库被设置为隔离级别并被设置为读取快照 设置事务隔离级别(事务级别)是否与设置已提交的读取快照(数据库级别)相同?我的意思是,如果我的数据库启用了快照,那么我可以在SP中设置隔离级别并相应地处理数据吗

我是微软Sql Server的新手。只有几个月的SQL Server SPs维护经验。我正在阅读有关优化SP的事务隔离级别的信息,对此感到非常困惑。请帮我回答以下问题:

  • 如果在ClientDB中运行DBCC useroptions,隔离级别的默认值为“read committed”。这是否意味着数据库被设置为隔离级别并被设置为读取快照

  • 设置事务隔离级别(事务级别)是否与设置已提交的读取快照(数据库级别)相同?我的意思是,如果我的数据库启用了快照,那么我可以在SP中设置隔离级别并相应地处理数据吗

  • 允许快照隔离与上述类似吗

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

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

  • 隔离级别“read committed”与启用read_committed_SNAPSHOT不同。将READ_COMMITTED_SNAPSHOT设置为ON将为所有查询设置默认隔离级别。然后使用“读取已提交”隔离级别的查询或过程使用快照隔离。请参阅联机丛书中的和

    当READ_COMMITTED_SNAPSHOT database选项设置为ON时,读取 提交隔离使用行版本控制来提供语句级别 阅读一致性。读取操作只需要SCH-S表级锁 并且没有页面或行锁。当READ_提交快照数据库时 选项设置为OFF,这是默认设置read committed 隔离的行为与早期版本的SQL Server中相同。二者都 实现满足ANSI对读提交隔离的定义

    允许\u快照\u隔离不会更改默认隔离级别。如果需要,它允许每个查询或过程使用快照隔离。要使用快照隔离的每个查询都需要设置事务隔离级别快照。在大型系统上,如果要使用快照隔离,可能需要使用快照隔离,而不是使用READ_COMMITTED_snapshot更改默认隔离级别

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


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

    Mike:谢谢你的回答。很抱歉,因为我遇到了其他问题,所以回复晚了。增加日志大小不是一个选项,因为我无法控制数据库。还检查了数据库和生产环境中是否关闭了快照隔离。所以现在这不是一个选择。因此,为了进一步提问,我上面问题中的第5点是关于将初始查询排除在TRAN/COMMIT例程之外。这对使用较少的tempDB有帮助吗?(因为临时表用于存储查询输出)或以任何其他方式使事务更高效?我不认为在循环中一次插入一百万行会对您有所帮助。一次插入一百万行并提交它们可能会有帮助,但是如果您的进程可以容忍这种风险,我会考虑直接更新基表。另外,SELECT INTO语句可以是。我已经研究了最小日志记录,我认为这将帮助我解决这个问题。我会发布一次,我可以使这项工作。非常感谢你指出这一点。