为了账号安全,请及时绑定邮箱和手机立即绑定

SELECT语句中NOLOCK提示的作用

SELECT语句中NOLOCK提示的作用

翻翻过去那场雪 2019-10-15 14:08:57
我想真正的问题是:如果我不在乎脏读,将带(NOLOCK)提示添加到SELECT语句中会影响以下内容的性能:当前的SELECT语句给定表的其他交易例:Select * from aTable with (NOLOCK)
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

1),带有的选择NOLOCK将比正常选择更快地完成。

2),带有的选择NOLOCK将允许对受影响的表进行其他查询比正常选择更快地完成。

为什么会这样呢?

NOLOCK通常(取决于您的数据库引擎)意味着将您的数据提供给我,我不在乎数据处于什么状态,并且在您读取数据时也不会费心保持数据状态。它的速度更快,资源占用更少,非常危险。

应该警告您不要对系统进行任何重要更新或执行任何对系统至关重要的事情,或者在使用NOLOCK读取数据时要求绝对正确的地方。绝对有可能该数据包含在查询运行期间已删除的行或在尚未完成的其他会话中已删除的行。此数据可能包含已部分更新的行。此数据可能包含违反外键约束的记录。此数据可能会排除已添加到表中但尚未提交的行。

您真的没有办法知道数据的状态。

如果您要获取诸如行计数或其他汇总数据之类的可接受误差范围的内容,那么这NOLOCK是提高这些查询的性能并避免对数据库性能产生负面影响的一种好方法。

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


查看完整回答
反对 回复 2019-10-15
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

由于缺少共享锁,NOLOCK使大多数SELECT语句更快。同样,缺少锁的发行意味着您的SELECT不会妨碍编写者。

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

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


查看完整回答
反对 回复 2019-10-15
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

  • 如果一次查询多次运行,答案是肯定的,因为每个事务都不需要等待其他事务完成。但是,如果查询单独运行一次,则答案为“否”。

  • 是的。谨慎使用WITH(NOLOCK)很有可能会整体上加快数据库的速度。这意味着其他事务不必等待此SELECT语句完成,但是另一方面,其他事务将减慢速度,因为它们现在与新事务共享其处理时间。

注意WITH (NOLOCK)在具有聚集索引的表上的SELECT语句中使用。

WITH(NOLOCK)通常被用作加快数据库读取事务速度的一种神奇方法。

结果集可以包含尚未提交的行,这些行通常在以后回滚。

如果将WITH(NOLOCK)应用于具有非聚集索引的表,则在将行数据流式传输到结果表时,其他事务可以更改行索引。这意味着结果集可能缺少行或多次显示同一行。

READ COMMITTED(读取已提交)增加了一个额外的问题,即数据在单个列中损坏,多个用户同时更改了同一单元格。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 525 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信