2016-03-04 27 views
1

我对使用NOLOCK有疑问。NOLOCK提示减慢操作吗?

我明白NOLOCK提示并不总是最好的方法,但在某些情况下,它是非常有帮助的。我并非试图制造一直使用它的坏习惯

我只是想了解它的确切行为。有这种不现实的说法,即更新记录的过程,其中id = 10 UPDATE table1 SET status = 2 WHERE id = 10需要30秒更新。同时我执行SELECT * FROM table1 WITH NOLOCK where id = 10

即使我的第一个查询对该记录有一个排它锁,或者我的select查询是否等到没有锁定记录之前它会允许读?

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

+0

[SELECT语句中的NOLOCK提示的影响]的可能重复(http://stackoverflow.com/questions/210171/effect-of-nolock-hint-in-select-statements) – DhruvJoshi

+3

相反,它可能会运行更快一点,因为它不必关心锁。是的,您的选择查询将读取该行...大部分时间。它可能会错过它,甚至可能会返回两次。看看这篇文章。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/它的目标是让人们远离使用该提示,但它也有很多非常有价值的信息。如果认为你需要阅读它,那么你就明白了这个提示的真正含义。 –

+3

'SELECT'可能会或可能不会读取该行。这被称为脏读,并且这样的行可能被读取为零,一次或两次。我注意到肖恩的评论引用了Aaron Bertrand在这个话题上的博客(我正在引用自己)。我第二次鼓励你阅读它。 –

回答

1

所述问题的简短答案是:“否”

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

在一天结束时查询会更快,但结果将是可疑的。