Answers:
1)是,带有的选择NOLOCK
将比普通选择更快地完成。
2)是,带有的选择NOLOCK
将允许对受影响的表进行其他查询比正常选择更快地完成。
为什么会这样呢?
NOLOCK
通常(取决于您的数据库引擎)意味着将数据提供给我,并且我不在乎数据处于什么状态,并且在您读取数据时也不必费心保持数据状态。它的速度更快,资源占用更少,非常危险。
应当警告您,切勿对系统进行任何重要的更新或执行任何对系统至关重要的事情,或者在使用NOLOCK
读取数据得出的绝对正确要求的情况下。绝对有可能该数据包含在查询运行期间删除的行或在尚未完成的其他会话中删除的行。此数据可能包含已部分更新的行。此数据可能包含违反外键约束的记录。此数据可能会排除已添加到表中但尚未提交的行。
您真的没有办法知道数据的状态。
如果您要获取诸如行计数或其他汇总数据之类的可接受误差范围的内容,那么这NOLOCK
是提高这些查询的性能并避免对数据库性能产生负面影响的好方法。
始终NOLOCK
谨慎使用提示,并处理可疑返回的任何数据。
由于缺少共享锁,NOLOCK使大多数SELECT语句更快。同样,缺少锁的发行意味着您的SELECT不会妨碍编写者。
NOLOCK在功能上等效于隔离级别READ UNCOMMITTED。主要区别在于,可以选择在某些表上使用NOLOCK,但不能在其他表上使用。如果计划在复杂查询中的所有表上使用NOLOCK,则使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED会更容易,因为您不必将提示应用于每个表。
这是有关您可以使用的所有隔离级别的信息,以及表提示。
除了上面所说的以外,您还应该非常清楚,nolock实际上会带来这样的风险,即您无法获得在选择之前已提交的行。
它将更快,因为它不必等待锁
如果一次查询多次运行,答案是肯定的,因为每个事务都不需要等待其他事务完成。但是,如果查询单独运行一次,则答案为“否”。
是的。谨慎使用WITH(NOLOCK)很有可能会整体上加快数据库的速度。这意味着其他事务不必等待此SELECT语句完成,但另一方面,其他事务将减慢速度,因为它们现在与新事务共享其处理时间。
注意仅WITH (NOLOCK)
在具有聚集索引的表上的SELECT语句中使用。
WITH(NOLOCK)通常被用作加快数据库读取事务速度的一种神奇方法。
结果集可以包含尚未提交的行,这些行通常在以后回滚。
如果将WITH(NOLOCK)应用于具有非聚集索引的表,则在将行数据流式传输到结果表时,其他事务可以更改行索引。这意味着结果集可能缺少行或多次显示同一行。
READ COMMITTED(读取已提交)增加了一个额外的问题,即数据在单个列中损坏,多个用户同时更改了同一单元格。