使用WITH(NOLOCK)来提高性能

时间:2011-03-21 10:16:26

标签: performance sql-server-2005 nolock

我见过开发人员在查询中使用WITH(nolock),有什么不利之处吗? 另外,查询的默认执行方式是什么?我的数据库没有任何索引。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

与nolock的常见误解是它在执行时没有对数据库进行锁定。从技术上讲,它确实发出了模式稳定性(sch-s)锁,因此锁的“否”部分与查询的数据端相关。

大多数时候,我看到这一点,开发人员过早地进行了优化,因为他们听说过这会使查询更快。

除非您在接受脏读(并且可能读取同一行两次)时已经检测了证明和有效性,否则不应该使用它 - 它肯定不应该是查询的默认方法,但是当它的规则是例外的可以证明它是必需的。

答案 2 :(得分:0)

当您从常用表中读取旧数据时,

NOLOCK非常有用。请考虑以下示例

  

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

当脏读不是问题并且数据不经常修改时,

NOLOCK也很有用,例如在下列情况下,

  

从数据库中读取国家/地区,货币等的列表....   在形式。这里数据保持不变,脏读也会   不会造成大问题,因为它很少发生。

然而,从SQL Server 2005开始,由于行版本控制,NOLOCK的好处很少。