2011-03-21 78 views
1

我见过开发人员在查询中使用WITH(nolock),是否有任何缺点? 另外,查询的默认执行模式是什么?我的数据库没有任何索引。使用WITH(NOLOCK)提高性能

有没有其他方法可以提高数据库选择语句的性能?

+1

那么,我会开始添加索引来提高性能。你可以得到一个巨大的表演。利用索引获得收益 – 2011-03-21 10:18:12

+0

可能的重复[SQL - 何时应该使用“with(nolock)”](http://stackoverflow.com/questions/686724/sql-when-should-you-use-with-nolock) – 2011-03-21 10:27:08

回答

2

nolock常见的误解是它在执行时不会锁定数据库。从技术上讲,它会发出模式稳定性(sch-s)锁,所以锁的“否”部分与查询的数据端相关。

大多数情况下,我看到这一点,开发人员提前做出优化是因为他们听说它使查询更快。

除非您在接受脏读(并可能读取同一行两次)中安装证明和有效性,否则不应该使用它 - 它肯定不应该是查询的默认方法,而是规则的一个例外可以证明它是必需的。

2

网上有很多关于此的文章。主要风险在于NOLOCK可以从表中读取未经处理的数据(脏读)。例如,请参阅http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspxhttp://www.techrepublic.com/article/using-nolock-and-readpast-table-hints-in-sql-server/6185492

+0

指向msdn的链接文章坏了。新的链接将是https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql – 2017-11-24 03:15:31

0

NOLOCK在从常用表格中读取旧数据时非常有用。考虑下面的例子,

您有一个存储过程来访问非活动项目的数据。您 不希望此存储过程在读取旧数据时锁定经常使用的项目表 表。

NOLOCK时也很有脏读不是一个问题,数据不被频繁修改,如在下列情况下,国家,货币等

阅读列表...从数据库在窗体中显示 。这里的数据保持不变,脏读将不会造成大问题,因为它很少会发生。