Sql 对SELECT语句使用NOLOCK的目的是什么?

Sql 对SELECT语句使用NOLOCK的目的是什么?,sql,select,nolock,Sql,Select,Nolock,有人能提出一个对SELECT语句发出NOLOCK的好理由吗 我正在重新分解一些乱七八糟的存储过程,据我所知,SELECT语句上的NOLOCK几乎毫无用处。因此,SELECT不会被并发数据修改查询阻塞 有些人认为这是一个神奇的快速按钮,并应用它自由。除非您的用例接受读取脏(未提交)数据的可能性,这些数据可能在您读取后回滚(因此在逻辑上不存在),并且某些类型的异常的可能性更大,否则它可能比无用更糟糕 与读取提交的隔离级别相比,nolock将使您的扫描丢失数据、读取两次或完全失败并出现数据移动错误的可

有人能提出一个对SELECT语句发出NOLOCK的好理由吗


我正在重新分解一些乱七八糟的存储过程,据我所知,SELECT语句上的NOLOCK几乎毫无用处。

因此,
SELECT
不会被并发数据修改查询阻塞

有些人认为这是一个神奇的快速按钮,并应用它自由。除非您的用例接受读取脏(未提交)数据的可能性,这些数据可能在您读取后回滚(因此在逻辑上不存在),并且某些类型的异常的可能性更大,否则它可能比无用更糟糕


与读取提交的隔离级别相比,nolock将使您的扫描丢失数据、读取两次或完全失败并出现数据移动错误的可能性更大。

nolock相当于事务上的读取未提交

简而言之,使用NOLOCK可以确保SELECT语句的速度,因为它不必等待现有锁或事务完成后再返回查询结果。不利的一面是,您最终可能会拉回“脏”数据—这些数据可能在提交之前回滚,但在运行SELECT语句之后回滚

更多信息可在中找到。


如果从内容很少更改的查找表中读取数据,则NOLOCK特别有用

当然,nolock的问题是,如果更新表,您可能会得到错误的数据。对于不断更新的表,有一些场景可以正确使用nolock。例如,您有以下表格:

用户配置 {id int主键, 是活动的标志位, 允许_x_特征位, 允许使用功能位 }


如果您正在运行select查询和按id筛选,那么即使此表经常更新,您也希望使用nolock。

我已经看到一些错误信息。选择时使用(NOLOCK)并不是一种性能工具,在需要速度的任何地方都可以使用。读这篇文章,它抛弃了以赛穆尔提供的答案,因为这是大多数人的想法,正如你从投票中看到的那样。不知道该怎么做的人会把他们听到的东西反刍出来。首先学习优化数据和查询。NOLOCK提示只应在系统中使用,在这些系统中,您一直在处理死锁记录或NOLOCK提供解决方案的其他问题

我在一家金融机构工作,该机构开发的系统每分钟处理大量交易,并向客户和客户提供实时报告功能。这些人整天都在读取我们的新数据,如果我们不使用NOLOCK进行报告查询,死锁发生只是时间问题


在将NOLOCK作为提高SQL查询速度的圣杯之前,请进行尽职调查,并阅读知名专业人士的资料。

请参阅将SQL提供程序/版本作为标记。很好,Martin,你说得对。回答更新了。对不起,巴德,给你-1。不要将NOLOCK提升为确保快速查询,因为它不适用于所有情况,并且只应在NOLOCK是您必须使用的唯一解决方案的情况下使用。如果不更新表,SQL Server可以避免对其使用共享行锁,因此不确定这实际会有多大好处。(Ref:)最好将这些不变的数据放在只读文件组中。