使用 WITH(NOLOCK) 提高性能
Posted
技术标签:
【中文标题】使用 WITH(NOLOCK) 提高性能【英文标题】:Using WITH(NOLOCK) to increase performance 【发布时间】:2011-03-21 10:16:25 【问题描述】:我见过开发者在查询中使用 WITH(nolock),有什么缺点吗? 另外,查询的默认执行模式是什么?我的数据库没有任何索引。
还有其他方法可以提高数据库选择语句的性能吗?
【问题讨论】:
好吧,我将从添加索引以提高性能开始。您可以获得巨大的性能。使用索引获得。 SQL - when should you use "with (nolock)"的可能重复 【参考方案1】:对 nolock 的常见误解是它在执行时不会在数据库上放置任何锁。从技术上讲,它确实会发出模式稳定性 (sch-s) 锁,因此锁的“否”部分与查询的数据端相关。
在我看到的大多数情况下,这是开发人员过早的优化,因为他们听说它可以使查询更快。
除非您在接受脏读(并且可能会读取同一行两次)时提供了证据和有效性,否则不应该使用它 - 它绝对不应该是查询的默认方法,而是规则的例外可以证明是必须的。
【讨论】:
【参考方案2】:网上有很多关于这方面的文章。主要风险是使用NOLOCK
,您可以从表中读取未提交的数据(脏读)。例如,请参阅http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspx 或 http://www.techrepublic.com/article/using-nolock-and-readpast-table-hints-in-sql-server/6185492
【讨论】:
msdn 文章的链接已损坏。新链接将是 docs.microsoft.com/en-us/sql/t-sql/statements/…【参考方案3】:NOLOCK
在您从常用表中读取旧数据时非常有用。考虑以下示例,
您有一个存储过程来访问非活动项目的数据。你 不希望这个存储过程锁定经常使用的项目 读取旧数据时的表。
NOLOCK
在脏读不成问题且数据不经常修改的情况下也很有用,例如以下情况,
从数据库中读取国家、货币等列表以显示 在表格中。这里数据保持不变,脏读将 不会造成大问题,因为它很少发生。
但是,从 SQL Server 2005 开始,由于行版本控制,NOLOCK 的好处很少。
【讨论】:
以上是关于使用 WITH(NOLOCK) 提高性能的主要内容,如果未能解决你的问题,请参考以下文章
在 LINQ-To-SQL 中,我应该使用 NOLOCK 来提高性能吗?
通过在打开 READ_COMMITTED_SNAPSHOT 的 SQL Server 数据库上使用 WITH (NOLOCK) 是不是可以获得任何性能提升?