当前位置:  开发笔记 > 数据库 > 正文

NOLOCK提示在SELECT语句中的作用

如何解决《NOLOCK提示在SELECT语句中的作用》经验,为你挑选了4个好方法。

我想真正的问题是:

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

    当前的SELECT语句

    针对给定表的其他事务

例:

Select * 
from aTable with (NOLOCK)

tom.dietrich.. 282

1)是的,选择NOLOCK将比正常选择更快完成.

2)是的,select with NOLOCK允许对受影响的表的其他查询比正常选择更快地完成.

为什么会这样?

NOLOCK通常(取决于您的数据库引擎)意味着向我提供您的数据,我不关心它处于什么状态,并且在您阅读它时不要打扰它.它一下子变得更快,资源更少,而且非常危险.

应该警告您永远不要进行更新或执行任何系统关键任务,或者使用源自NOLOCK读取的数据需要绝对正确性.此数据绝对可能包含在查询运行期间删除的行或已在其他尚未最终确定的会话中删除的行.此数据可能包含已部分更新的行.此数据可能包含违反外键约束的记录.此数据可能会排除已添加到表但尚未提交的行.

你真的无法知道数据的状态.

如果您尝试获取行计数或其他可以接受某些误差范围的摘要数据,那么这NOLOCK是提高这些查询性能并避免它们对数据库性能产生负面影响的好方法.

始终NOLOCK谨慎使用提示并处理它可疑返回的任何数据.



1> tom.dietrich..:

1)是的,选择NOLOCK将比正常选择更快完成.

2)是的,select with NOLOCK允许对受影响的表的其他查询比正常选择更快地完成.

为什么会这样?

NOLOCK通常(取决于您的数据库引擎)意味着向我提供您的数据,我不关心它处于什么状态,并且在您阅读它时不要打扰它.它一下子变得更快,资源更少,而且非常危险.

应该警告您永远不要进行更新或执行任何系统关键任务,或者使用源自NOLOCK读取的数据需要绝对正确性.此数据绝对可能包含在查询运行期间删除的行或已在其他尚未最终确定的会话中删除的行.此数据可能包含已部分更新的行.此数据可能包含违反外键约束的记录.此数据可能会排除已添加到表但尚未提交的行.

你真的无法知道数据的状态.

如果您尝试获取行计数或其他可以接受某些误差范围的摘要数据,那么这NOLOCK是提高这些查询性能并避免它们对数据库性能产生负面影响的好方法.

始终NOLOCK谨慎使用提示并处理它可疑返回的任何数据.


旁注:如果这是真的,那将是绝对的混乱.
你的朋友需要阅读文档.表提示(Transact-SQL)http://msdn.microsoft.com/en-us/library/ms187373(SQL.90).aspx
... 2005年没有任何影响.我们现在正在运行2000(感谢我们的供应商),文档中没有类似的声明.

2> Pittsburgh D..:

由于缺少共享锁,NOLOCK使大多数SELECT语句更快.此外,缺少发行锁意味着编写器不会受到SELECT的阻碍.

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

以下是您可以使用的所有隔离级别的信息,以及表提示.

设置交易隔离级别

表提示(Transact-SQL)


我同意,但不完全同意。重要的是要指出,NO LOCK / READ UNCOMMITTED提示实际上并没有提高查询的速度,但更多的是,它使显示速度更快,因为它不必等待先前的查询完成。因此,确实,查询SEEMS更快,而不是IS更快(我认为)。

3> 小智..:

除了上面提到的内容之外,你应该非常清楚nolock实际上存在的风险是你没有获得你选择之前已经提交的行.

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



4> StingyJack..:

它会更快,因为它不必等待锁


"多少"取决于您对数据的具体操作以及您通常需要等待锁定获取的时间.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有