我见过开发人员在查询中使用 WITH(nolock),它有什么缺点吗?另外,查询的默认执行模式是什么?我的数据库没有任何索引。
有没有其他方法可以提高数据库选择语句的性能?
我见过开发人员在查询中使用 WITH(nolock),它有什么缺点吗?另外,查询的默认执行模式是什么?我的数据库没有任何索引。
有没有其他方法可以提高数据库选择语句的性能?
网上有很多关于这方面的文章。主要风险是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
对 nolock 的常见误解是它在执行时没有在数据库上放置任何锁。从技术上讲,它确实会发出模式稳定性 (sch-s) 锁,因此锁的“否”部分与查询的数据端相关。
大多数情况下,我看到这是开发人员过早的优化,因为他们听说它使查询更快。
除非您在接受脏读(并且可能会读取同一行两次)时提供了证据和有效性,否则不应该使用它 - 它绝对不应该是查询的默认方法,而是可以显示时的规则例外它是必需的。
NOLOCK
当您从常用表中读取旧数据时,它非常有用。考虑以下示例,
您有一个存储过程来访问非活动项目的数据。您不希望此存储过程在读取旧数据时锁定常用的 Projects 表。
NOLOCK
当脏读不是问题并且数据不经常修改时也很有用,例如在以下情况下,
从数据库中读取国家、货币等的列表以显示在表格中。这里数据保持不变,脏读不会造成大问题,因为它很少发生。
但是,从 SQL Server 2005 开始,由于行版本控制,NOLOCK 的好处很少。