【发布时间】:2013-04-02 17:28:12
【问题描述】:
理解最终决策是业务决策,在 SQL 2008 R2 中运行的 NOLOCK 和 READPAST 之间的准确性考虑是什么?在与业务领域讨论变更之前,我希望有一个更好的了解。
我继承了一些查询,用于为管理报告创建数据视图。 “WITH (NOLOCK)”被广泛使用但不一致。正在读取的数据来自不断更新的广泛使用的应用程序的生产服务器。我们正在从 SQL 2005 服务器迁移到 SQL 2008 R2 服务器。这些报告需要比存档服务器上的 24 小时旧数据更新的数据。 NOLOCK 的使用暗示了过去的决定;存在冲突的可能性,并且有点准确性损失是可以接受的。数据用于填充仪表板以进行人类意识/决策。
所有查询都是 SELECT,对数据视图登录具有只读访问权限。大多数查询是带有少量 2 表和 3 表连接的单表。鉴于连接的低级别 WITH () 似乎比 SET TRANSACTION ISOLATION LEVEL {}
Table Hints (Transact-SQL) http://msdn.microsoft.com/en-us/library/ms187373.aspx(以及关于 SO 的多个问题)表示 NOLOCK 和/或 READUNCOMMITTED 除了丢失锁定记录外,还可能存在重复读取问题。
READPAST 看起来更准确,因为它只会丢失锁定的记录而没有重复的机会。但我不确定它和 NOLOCK 之间丢失锁定记录的级别是否一致。
Tim Chapman 有一篇很好的文章比较了两者,但它写于 2007 年,大多数 cmets 围绕 2000 年和 2005 年展开,有一条评论表明 READPAST 在 2008 R2 中存在问题
参考资料
Effect of NOLOCK hint in SELECT statements
When should you use "with (nolock)"
Using NOLOCK and READPAST table hints in SQL Server (By 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 行为的信息。然而,它们仍然是我唯一的选择。
【问题讨论】:
-
要考虑的一件事是运行报告需要多长时间,如果报告锁定表,报告将阻止多少其他进程。如果您担心由于 NOLOCK 和 READPAST 导致数据不准确,那么明智的做法是考虑不使用它们会对系统产生什么影响。
-
第一个问题是不影响主应用程序。这些是完整的报告数据集,报告速度始终仅次于主要更新。仪表板报告就像您汽车中的车速表,只要我们不影响汽车性能,就可以给出或取几个百分比的准确度。
标签: sql sql-server locking