SQL Server NOLOCK并加入


153

背景:我有一个对性能至关重要的查询,我想运行它,并且我不关心脏读。

我的问题是;如果使用联接,是否也必须在联接上指定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)在联接上指定提示,以确保不锁定联接表?

Answers:


166

我不会讨论这个READ UNCOMMITTED论点,而只是您的原始问题。

是的,您需要WITH(NOLOCK)在联接的每个表上。不,您的查询不一样。

试试这个练习。开始事务并将行插入到table1和table2中。暂时不要提交或回滚事务。至此,您的第一个查询将成功返回并包含未提交的行;您的第二个查询将不会返回,因为table2没有WITH(NOLOCK)提示。


18

我非常确定您需要在查询中NOLOCK为每个指定JOIN。但是我的经验仅限于SQL Server 2005。

当我查找MSDN只是为了确认时,找不到任何确定的东西。以下语句似乎使我认为,对于2008年,您的上述两个语句是等效的,尽管对于2005年不是这样:

[SQL Server 2008 R2]

所有锁定提示都传播到查询计划访问的所有表和视图,包括视图中引用的表和视图。此外,SQL Server执行相应的锁一致性检查。

[SQL Server 2005]

在SQL Server 2005中,所有锁定提示都传播到视图中引用的所有表和视图。此外,SQL Server执行相应的锁一致性检查。

此外,请注意-这适用于2005年和2008年:

如果查询计划未访问表,则将忽略表提示。这可能是由于优化程序选择根本不访问表,或者是因为访问了索引视图导致的。在后一种情况下,可以通过使用OPTION (EXPAND VIEWS)查询提示来防止访问索引视图。


@In Sane:有趣的...感谢...我假设通过将它包括在JOINS中对我没有害处,即使不是完全必要的吗?正如您所提到的,NOLOCK上的文档很少。我自己找不到任何决定性的问题。
DanP 2010年

2
@InSane:您从哪里获得此信息的?这似乎与公认的答案背道而驰。
杰伊·沙利文

1
@notfed-请参阅technet链接technet.microsoft.com/zh-cn/library/ms187373(v=sql.105).aspx-您可以更改数据库的顶部版本,以将同一文章用于不同版本的数据库进行比较
Jagmag

2
2005年的文字谈到了VIEWS。因此,如果您“从带有(nolock)的myview中进行”操作,则表示nolock会传播到myview中涉及的所有表和视图(其中可能有10个联接)。不确定2008文本的确切含义是什么,因为它除了视图之外还添加了“由查询计划访问”。
Thierry_S

9

都不行 您将隔离级别设置READ UNCOMMITTED为始终比提供单个锁定提示更好。或者,更好的是,如果您关心诸如一致性之类的细节,请使用快照隔离


@Remus:我不确定我是否可以使用READ UNCOMMITTED,因为我正在通过NHibernate访问连接以执行特殊的原始ADO.NET调用;可以在查询中以内联方式指定它,还是遵循NHibernate事务中存在的事务级别?
DanP 2010年

包裹呼叫using (TransactionScope scope=new TransactionScope(..., TransactionOptions) {...},并设置IsolationLevel上的选项:msdn.microsoft.com/en-us/library/...
莱姆斯Rusanu

@Remus:不幸的是,事务管理的管理水平要高得多,所以这也不是一种选择。
DanP

我懂了。然后回答您的问题:NOLOCK是一个提示,因此它适用于要添加到的行集(表,视图,TVF等)。如果查询中有多个行集,则每个行集都需要自己的NOLOCK提示。
Remus Rusanu

2
但是,您是否考虑过快照隔离?ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;。结果是惊人的,因为所有常规读取提交的读取都变成快照读取,无锁但一致。成本增加了tempdb负载:msdn.microsoft.com/en-us/library/ms175492.aspx
Remus Rusanu 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.