证明在每个查询中不使用 (nolock) 提示
-
16-10-2019 - |
题
您是否曾经不得不证明不使用查询提示是合理的?
我看到 WITH (NOLOCK)
在访问非常繁忙的服务器的每个查询中。开发人员认为它应该默认打开,因为他们讨厌在代码中看到它数千次。
我试图解释说它允许脏读,最终会得到坏数据,但他们认为性能权衡是值得的。(他们的数据库一团糟;难怪他们有性能问题。)
如果您有一个明确的例子来说明如何针对这种滥用行为提出案例 NOLOCK
提示,我们将不胜感激。
解决方案
您选择这样的战斗和战斗很难赢得。我们有一个系统,其中每个DML都用Rowlock提示暗示(不论修改一行或几千行)。我展示了几个示例,为什么它确实损害了性能,但是由于系统已经起作用,因此有抵抗力的变化。请注意,我说服他们足以不使用它。
Nolock拥有它的位置,但我可以推荐一些很好的参考文献,以展示使用它的麻烦:
- Microsoft SQL Server开发客户咨询团队博客 - 如果使用Nolock提示,可能会错过以前承诺的行
- SQL杂志的Itzik Ben Gan - 聚类索引扫描第三部分
- sqlpass.org上的itkiz ben gan - 当心Nolock提示
其他提示
之前在SO上讨论过:
- https://stackoverflow.com/questions/2141104/using-nolock-hint-in-ef4/2141802#2141802
- https://stackoverflow.com/questions/1682240/what-can-happen-as-a-result-of-using-nolock-on-every-select-in-sql-sever
定义非常忙碌。我们的数据量很大(每秒 50k 新行、大型聚合等),并且认为没有必要获取可疑数据
您必须向同事解释了解隔离水平的重要性。向他们展示示例。我在小肯德拉(Little Kendra)上找到的最好,最简单的解释 隔离水平的海报。问他们为什么他们认为他们需要Nolock提示。他们为什么不使用“设置交易隔离级别...”语句?询问他们要解决的情况到底是什么,也许他们有僵局,阻止.. etc。如果他们只是不想握住锁,他们可能会考虑快照隔离水平。
只有问他们,您才能有清晰的图片。
不隶属于 dba.stackexchange