【问题标题】:READ UNCOMMITTED and Estimates阅读未提交和估计
【发布时间】:2011-09-17 17:32:39
【问题描述】:

有时,我想运行一个存储过程来粗略估计两个或三个不同表中有多少记录满足某些条件。如果在此估计期间添加、删除或更新了新记录,则没有真正的问题(我只是想要一个粗略的估计)。也就是说,我可以使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 负担这个过程。但是,我对此有两个问题:

1) 由于我只使用SELECT COUNT(*) 指令,我真的需要将这些语句包装在BEGIN/COMMIT TRANSACTION 块中吗?

2) 我是否需要在存储过程的末尾返回SET TRANSACTION ISOLATION LEVEL READ COMMITTED,还是会在其执行结束后自动设置?

【问题讨论】:

    标签: sql-server-2005 isolation-level read-uncommitted


    【解决方案1】:
    1. 没有。读取不需要在事务中

    2. SET 仅适用于存储过程。在这里查看我的答案:Is it okay if from within one stored procedure I call another one that sets a lower transaction isolation level?。但是,您应该使用 NOLOCK 提示而不是 SET:SELECT COUNT(*) FROM myTable WITH (NOLOCK)

    如果您想要一个不带 WHERE 过滤器的近似计数,请使用 sys.dm_db_partition_stats。在这里查看我的答案:Fastest way to count exact number of rows in a very large table?

    【讨论】:

      【解决方案2】:

      1) 否。如果您不指定事务范围,它将对每个语句使用隐式事务。您不必为使“设置事务隔离级别起作用”设置明确的事务范围。

      2) 您不必将其重置为原始状态。它将由 SQL Server 处理。请参考这个 SO 条目:Transaction Isolation Level Scopes

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-07
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 2021-01-04
        • 2010-09-08
        • 2010-12-06
        • 1970-01-01
        相关资源
        最近更新 更多