带有 (NOLOCK) 提示的 SQL 服务器

Posted

技术标签:

【中文标题】带有 (NOLOCK) 提示的 SQL 服务器【英文标题】:SQL server with (NOLOCK) hint 【发布时间】:2014-10-01 08:25:03 【问题描述】:

有人能解释一下在 SQL 查询中使用 with (NOLOCK) 是否真的会使它们运行得更快吗?如果是这样,为什么?

【问题讨论】:

您阅读过文档吗? 您可能希望在将它们弹出到您的代码库之前阅读此内容,特别是如果您不确定它们的作用:blogs.msdn.com/b/davidlean/archive/2009/04/06/… 同一问题有多个重复,您应该在发布重复之前参考它们。 【参考方案1】:

使用NOLOCK 本身并不会加快您的个人查询速度。但它允许其他查询访问同一个表,从而减少了因死锁而损失的时间。

当一个客户端选择更新表并花费大量时间来完成事务时,这特别有用。使用NOLOCK 命令,其他客户端可以执行尝试访问表的查询。他们不必等待更新完成,因此即使一个事务仍在进行中,其他事务也可以完成。

这并不意味着使用NOLOCK 命令可以提高单个查询的性能。它只是提高了涉及多个客户端或正在执行批处理的整体性能。

但是,您需要注意使用NOLOCK 时的脏读风险。 Here's a good article 解释了为什么您通常应该避免使用 NOLOCK

【讨论】:

【参考方案2】:

带(无锁)(source):

不要发布共享锁,也不要使用独占锁。当此选项生效时,可以读取未提交的事务或在读取过程中回滚的一组页面。脏读是可能的。仅适用于 SELECT 语句。

【讨论】:

以上是关于带有 (NOLOCK) 提示的 SQL 服务器的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server NOLOCK 提示会返回部分写入的行吗?

数据移动,未能继续以NOLOCK方式扫描!

[SQL SERVER][Performance]小心使用With NoLock

SQL Server 中WITH (NOLOCK)

金蝶专业版过账时提示:名称或代码已被使用由于数据移动,未能继续以 NOLOCK 方式扫描

用友U8做期末处理时提示由于数据移动,未能继续以NOLCOK方式扫描