了解最终决策是业务决策,SQL 2008 R2 中运行的 NOLOCK 和 READPAST 之间的准确性考虑是什么?在与业务领域讨论更改之前,我希望有一个更好的了解。
我继承了许多查询,用于为管理报告创建数据视图。'WITH (NOLOCK)' 被广泛使用但不一致。正在读取的数据来自不断更新的广泛使用的应用程序的生产服务器。我们正在从 SQL 2005 服务器迁移到 SQL 2008 R2 服务器。这些报告需要比存档服务器上的 24 小时旧数据更新的数据。NOLOCK 的使用暗示了过去的决定;存在冲突的可能性,并且有点准确性损失是可以接受的。数据用于填充仪表板以进行人类意识/决策。
所有查询都是 SELECT,对数据视图登录具有只读访问权限。大多数查询是带有少量 2 和 3 表连接的单表。鉴于连接的低级别 WITH () 似乎比 SET TRANSACTION ISOLATION LEVEL {} 更好
表提示(Transact-SQL)http://msdn.microsoft.com/en-us/library/ms187373.aspx(以及关于 SO 的多个问题)说 NOLOCK 和/或 READUNCOMMITTED 可能有重复读取问题,除了丢失锁定的记录。
READPAST 看起来更准确,因为它只会错过锁定的记录而没有重复的机会。但我不确定它和 NOLOCK 之间丢失锁定记录的级别是否一致。
Tim Chapman 有一篇很好的文章比较了这两者,但它写于 2007 年,大部分评论围绕 2000 年和 2005 年,其中一条评论表明 READPAST 在 2008 R2 中存在问题
参考
在 SQL Server 中使用 NOLOCK 和 READPAST 表提示(作者 Tim Chapman)
编辑:
以下两个答案建议使用快照隔离。快照隔离是数据库的依赖设置,这个 Q/A https://serverfault.com/questions/117104/how-can-i-tell-if-snapshot-isolation-is-turned-on描述了如何查看什么设置都在数据库中。我现在知道它已被禁用,我正在阅读来自主要应用程序数据库的报告。更改设置不是一种选择。+- 几个百分比的准确度是可以接受的,应用程序 (OLTP) 影响是不可接受的。大多数简单查询不需要考虑锁定,但在某些极端情况下,需要考虑锁定。随着 SQL 2005 快照隔离的出现,关于 SQL 2008 或更高版本中的 NOLOCK 和 READPAST 行为的可用信息很少。然而,它们仍然是我唯一的选择。