【发布时间】:2020-04-28 07:31:36
【问题描述】:
我有一个关于在 SQL Server 中使用 WITH (NOLOCK / READPAST) 的问题。
当我在一个或两个表上使用 WITH (NOLOCK / READPAST) 提示,并且我在 JOIN 中有其他表时,我应该对所有表使用该提示,还是只对我知道有此需求的表使用该提示?
【问题讨论】:
-
Table hints 按表应用。 Query hints 按查询申请。 Nolock 是一个表格提示。
-
你能解释清楚为什么你“需要”NOLOCK吗?这是一个名称不太好的查询提示。它还有一些大多数人似乎没有意识到的主要包袱。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
-
至于手头的问题。没有人可以明确地告诉您是否应该使用所有表格。我会严重倾向于完全不使用。
-
在 worst 我建议你只在你遇到死锁的表上使用它,并为(始终)错误的数据做好准备。充其量,根本不使用它并修复潜在的性能问题;索引和统计是很好的起点。
-
添加
NOLOCK(除非您的索引缺失)不会加快读取未更改数据的速度,因为引擎足够聪明,可以仅锁定需要锁定的行。对于您几乎完全根据时间读取的表并且仅按时间顺序插入行的表,将插入/审核日期设置为(非唯一)聚集索引会很有意义。然后NOLOCK应该几乎没有用处,即使这还不够,首先考虑诸如快照隔离和内存表之类的替代方案也是有意义的。将NOLOCK视为“我不介意错误的结果”。
标签: sql-server nolock