背景:我有一个性能关键型查询要运行,并且我不关心脏读。
我的问题是:如果我使用joins,我是否也必须在这些连接上指定NOLOCK提示?
例如;是:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID等同于:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID或者,我是否需要在连接上指定(NOLOCK)提示,以确保我没有锁定连接的表?
发布于 2010-09-24 23:09:41
我不会讨论READ UNCOMMITTED的争论,只讨论你最初的问题。
是的,您需要在连接的每个表上使用WITH(NOLOCK)。不,您的查询不是相同的。
试试这个练习。开始一个事务并在table1和table2中插入一行。暂时不要提交或回滚事务。此时,第一个查询将成功返回并包含未提交的行;第二个查询不会返回,因为table2没有WITH(NOLOCK)提示。
发布于 2010-09-24 10:04:40
我非常确定您需要为查询中的每个JOIN指定NOLOCK。但我的经验仅限于SQL Server 2005。
当我查找MSDN进行确认时,我找不到任何确定的东西。下面的陈述似乎确实让我认为,对于2008年,你上面的两个陈述是等价的,尽管2005年不是这样的:
SQL Server2008 R2
所有锁提示都将传播到查询计划可通过访问的所有表和视图,包括视图中引用的表和视图。此外,SQL Server还会执行相应的锁一致性检查。
SQL Server2005
在SQL Server2005中,所有锁提示都会传播到视图中引用的所有表和视图。此外,SQL Server还会执行相应的锁一致性检查。
此外,请注意-这适用于2005年和2008年:
如果查询计划未访问表,则忽略表提示。这可能是因为优化器选择根本不访问表,或者因为访问的是索引视图。在后一种情况下,可以使用
OPTION (EXPAND VIEWS)查询提示阻止访问索引视图。
发布于 2010-09-24 10:25:04
都不是。您可以将隔离级别设置为READ UNCOMMITTED,这总比提供单独的锁提示要好。或者,更好的是,如果你关心像consistency这样的细节,使用snapshot isolation。
https://stackoverflow.com/questions/3783525
复制相似问题