我想真正的问题是:
如果我不关心脏读,将添加with(NOLOCK)提示到SELECT语句会影响性能:
当前的SELECT语句
针对给定表的其他事务
例:
Select * from aTable with (NOLOCK)
tom.dietrich.. 282
1)是的,选择NOLOCK
将比正常选择更快完成.
2)是的,select with NOLOCK
允许对受影响的表的其他查询比正常选择更快地完成.
为什么会这样?
NOLOCK
通常(取决于您的数据库引擎)意味着向我提供您的数据,我不关心它处于什么状态,并且在您阅读它时不要打扰它.它一下子变得更快,资源更少,而且非常危险.
应该警告您永远不要进行更新或执行任何系统关键任务,或者使用源自NOLOCK
读取的数据需要绝对正确性.此数据绝对可能包含在查询运行期间删除的行或已在其他尚未最终确定的会话中删除的行.此数据可能包含已部分更新的行.此数据可能包含违反外键约束的记录.此数据可能会排除已添加到表但尚未提交的行.
你真的无法知道数据的状态.
如果您尝试获取行计数或其他可以接受某些误差范围的摘要数据,那么这NOLOCK
是提高这些查询性能并避免它们对数据库性能产生负面影响的好方法.
始终NOLOCK
谨慎使用提示并处理它可疑返回的任何数据.
1)是的,选择NOLOCK
将比正常选择更快完成.
2)是的,select with 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
它会更快,因为它不必等待锁