NOLOCK 提示会减慢操作速度吗?

Jun*_*ior 6 sql sql-server nolock locking query-optimization

我有一个关于使用的问题NOLOCK

我知道NOLOCK提示并不总是最好的方法,但在某些情况下它非常有帮助。我并不是想养成一直使用它的坏习惯

我只是想了解它的确切行为。有这样一个不切实际的假设:正在更新 id = 10 的记录的进程UPDATE table1 SET status = 2 WHERE id = 10需要 30 秒来更新。同时我执行SELECT * FROM table1 WITH NOLOCK where id = 10

即使我的第一个查询在记录上有独占锁,我的 select 语句是否会读取该行,或者我的 select 查询是否会等到记录上没有锁才允许读取?

我想知道使用是否NOLOCK会导致延误。

Jos*_*osh 4

对上述问题的简短回答是:“不”。

在大多数情况下,NOLOCK 提示将加快相关查询的速度,以及同时对指定表进行操作的任何其他查询的速度。原因是没有检查或获取锁。您已经在问题中列出了可能的副作用,因此我不会在这里介绍这些副作用。

最终查询会更快,但结果会令人怀疑。

  • 人们总是说“结果会受到怀疑”或“你不能相信从 NOLOCK 查询返回的数据”等。但唯一会出现问题的是,如果有人在以下位置写入*相关*数据:与查询同时进行。在这种情况下,如果您提前 10 秒运行查询,则无论是否使用 NOLOCK,都会得到与晚 10 秒运行查询不同的结果。如果您的结果必须准确到额外一行数据会导致问题的程度,并且您正在从当前正在写入的表中读取数据,那么您首先就做错了。 (3认同)