【问题标题】:with(nolock) or (nolock) - Is there a difference?with(nolock) 或 (nolock) - 有区别吗?
【发布时间】:2012-08-20 05:19:28
【问题描述】:

一切都基于 with(nolock) 完全适合这种情况的假设。已经有很多问题在争论是否使用 with(nolock)。

我环顾四周,无法找到使用with(nolock) 之间是否存在实际差异:

select customer, zipcode from customers c with(nolock) 

或者只是(nolock):

select customer, zipcode from customers c (nolock) 

两者在功能上有区别吗?风格?
一个比另一个旧并且有可能被弃用?

【问题讨论】:

标签: sql sql-server select sql-server-2008-r2 nolock


【解决方案1】:

这实际上取决于您使用的 SQL Server 版本。

查看 SQL Server 2012 table hints 的最新文档而忽略 WITH 是一项已弃用的功能。所以虽然from customers c (nolock) 可能会起作用;你真的应该使用from customers c WITH (nolock)

请注意,这与from customers nolock 不同;其中 nolock 将用作表别名。

功能上;它们看起来是一样的。

【讨论】:

    【解决方案2】:

    没有功能上的区别,但最终没有WITH 的语法将不起作用。这已被弃用:

    select customer, zipcode from customers c (nolock) 
    

    所以你应该使用这种格式:

    select customer, zipcode from customers c with (nolock) 
    

    至少从 SQL Server 2008 开始,不推荐使用 WITH 关键字作为表提示。在以下主题中搜索短语 Specifying table hints without using the WITH keyword.

    http://msdn.microsoft.com/en-us/library/ms143729%28SQL.100%29.aspx

    (当然,关于是否应该使用nolock 的讨论是分开的。I've blogged about them here。)

    【讨论】:

    • 关于何时使用with(nolock)的参考:stackoverflow.com/questions/686724/…
    • @AaronBertrand 您指定的 MSDN 链接表明 NOLOCK 仅在 UPDATE 和 DELETE 语句中被弃用。它似乎没有被 SELECT 语句弃用。
    • @Dono 我从来没有说过 NOLOCK 已被弃用。我说NOLOCK 没有WITH 关键字。请注意我的两个代码示例之间的区别。
    【解决方案3】:

    我对 170000+ 数据行的结果进行了尝试,但是通过查询执行计划我没有看到任何差异。两者的工作方式相同。

    【讨论】:

    • 这应该是评论,而不是答案。一年多前已经两次提到没有功能差异。
    • 很高兴知道您已经在一张不小的桌子上比较了计划。为了将来参考,了解您使用的 SQL Server 的版本号可能会有所帮助。 (无论如何+1)
    【解决方案4】:

    虽然我们没有发现 (nolock) 和 with(nolock) 之间的区别...... with (nolock) 在 SQL Server 2000 版本中不起作用。

    而且我还注意到,当您尝试从链接服务器中提取数据时,仅“ (nolock) ”将不起作用,而您应该使用“ with (nolock) ”。

    -- this will not work 
    select * from server1.DB1.dbo.table1 (nolock)
    
    -- this will  work 
    select * from server1.DB1.dbo.table1 with (nolock)
    

    【讨论】:

    • 感谢您花时间发帖。这应该是对上面 Aaron 帖子的评论,但我可以看到您还没有发布 cmets 的声誉。 +1 助您顺利上路。
    猜你喜欢
    • 2014-02-02
    • 2020-10-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2020-04-28
    • 2016-03-29
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多