SELECT语句中的NOLOCK提示的影响

我想真正的问题是:

如果我不关心脏读,将向SELECT语句添加with(NOLOCK)提示会影响以下性能:

  • 当前的SELECT语句
  • 针对给定表的其他交易
  • 例:

    Select * 
    from aTable with (NOLOCK)
    

    1) 是的 ,使用NOLOCK的选择将比正常选择更快地完成。

    2) 是的 ,使用NOLOCK的选择将允许针对受影响表的其他查询以比正常选择更快的速度完成。

    为什么会这样?

    NOLOCK通常(取决于您的数据库引擎)意味着向我提供您的数据,我不在乎它处于什么状态,并且在您读取数据时不要拘谨。 这一切都马上更快,资源更少,而且非常非常危险。

    应该警告您不要执行任何系统更新或执行任何操作,或者需要使用源自NOLOCK读取的数据的绝对正确性。 这些数据绝对有可能包含在查询运行过程中被删除的行或者在尚未完成的其他会话中删除的行。 该数据可能包含已部分更新的行。 这些数据可能包含违反外键约束的记录。 该数据可能会排除已添加到表中但尚未提交的行。

    你真的无法知道数据的状态是什么。

    如果您想要获得像行计数或其他汇总数据那样的错误容限,那么NOLOCK是一种提升这些查询性能的好方法,并避免它们对数据库性能产生负面影响。

    请务必谨慎使用NOLOCK提示,并对可疑返回的数据进行处理。


    由于缺少共享锁,NOLOCK使大多数SELECT语句更快。 此外,缺少发行锁意味着作家不会被你的SELECT阻碍。

    NOLOCK在功能上等同于READ UNCOMMITTED的隔离级别。 主要区别在于,如果您选择,您可以在某些表格上使用NOLOCK,但不能在其他表格上使用NOLOCK。 如果您计划在复杂查询中的所有表上使用NOLOCK,那么使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED更容易,因为您不必将提示应用于每个表。

    以下是关于您所处的所有隔离级别的信息,以及表格提示。

    设置事务隔离级别

    表提示(Transact-SQL)


    除了上面所说的内容之外,您应该非常清楚nolock实际上会增加您选择之前 没有获取已经执行的行的风险。

    请参阅http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

    链接地址: http://www.djcxy.com/p/32853.html

    上一篇: Effect of NOLOCK hint in SELECT statements

    下一篇: How do add NOLOCK with nHibernate?