SQL SERVER,使用(TABLOCKX)选择查询会比使用(NOLOCK)更快,反之亦然?

Posted

技术标签:

【中文标题】SQL SERVER,使用(TABLOCKX)选择查询会比使用(NOLOCK)更快,反之亦然?【英文标题】:SQL SERVER, will select query with (TABLOCKX) faster than with(NOLOCK) or vice versa? 【发布时间】:2016-11-18 08:54:04 【问题描述】:

我对上述问题有疑问。我们在整个应用程序中使用 with nolock。在某些情况下,我需要更快地进行选择,无论效果如何。

所以select with(TABLOCKX) 会更快还是with(nolock)

【问题讨论】:

不要在整个应用程序中使用“nolock”。 - 在高插入场景中,您可能会得到不准确的值。如果您不关心结果是否 100% 准确或知道活动不会导致页面拆分,则报告查询可能是可以的。 如果您的应用程序在任何地方都锁定了数据库,那么它可能需要等待才能获取资源,因此在这种情况下,我预计性能会降低。但是如果从逻辑的角度来看你需要一个数据库锁,那么你当然应该使用它。 如果没有其他人在使用临界区,那么等待数据库的传入线程可能不会花费明显的额外时间来获取锁或释放它。但是话又说回来,一旦它拥有了锁,任何其他也在等待该锁的人都会被延迟。你的问题有点含糊。 阅读 Aaron Bertrand 的 Bad habits : Putting NOLOCK everywhere 我建议其他人只在绝对必要时才使用 nolocks。回到过去,当 SQL SERVER 引擎不如现在好时,它很流行。我只对非关键报告查询使用 nolocks。 【参考方案1】:

要回答您的问题,with (nolock) 表提示会更快。

NOLOCK 通常(取决于您的数据库引擎)意味着给我您的数据,我不在乎它处于什么状态,并且在您读取它时不要打扰它。它同时速度更快、资源消耗更少,而且非常危险。

这里解释得很好NoLock

【讨论】:

【参考方案2】:

Nolock 意味着您可以读取一些锁定的行(使用共享锁)。但是你仍然需要等待其他锁。

Tablockx 意味着你用独占锁来阻塞整个表以供其他查询使用——其他会话不能做锁,你阻塞整个表后不能被阻塞。 Tablockx 主要用于快速插入。

避免在任何地方使用 nolock。尽量避免长时间使用独占锁,或者尽量减少阻塞,这样就不需要 nolocks。

【讨论】:

以上是关于SQL SERVER,使用(TABLOCKX)选择查询会比使用(NOLOCK)更快,反之亦然?的主要内容,如果未能解决你的问题,请参考以下文章

查看SQL Server被锁的表以及如何解锁

SQL Server:嵌套循环两个选择

使用 PHP 从 SQL Server 中选择数据

Sql server在选择顶行中使用变量[重复]

如何使用 SQL Server 连接选择中的所有列

安装sql server 2008时,到功能选择时提示验证码错误,属性不匹配!想请教