避免在重读表上锁定的最佳做法?

时间:2010-05-06 14:45:19

标签: performance sql-server-2008 locking

我有一个大型数据库(~4GB),有2个大表(~3M记录),每小时约180K,每小时约2K,每小时约2k,小时数+ 1小时。

在插入/更新/删除时,保证读取任务没有锁定的最佳做法是什么?

我正在考虑使用NOLOCK提示,但是有很多关于这个的讨论(很好,很糟糕,这取决于我)有点迷失。我必须说我已经在开发环境中尝试过这种方法而且我没有发现任何问题,但我不想在得到反馈之前将其投入生产......

更新:我根据收到的评论澄清了这一点 - 由于此应用程序处理的业务,我不介意SELECTed记录是否因为同时删除/更新而变旧。下一次阅读将返回新的,这很好。

更新2 :在此应用程序中,当插入或更新记录时,很可能至少保持一个月的完整性。 (所以也许我可以根据'lastUpdated'列对表进行分区?)

谢谢! Luiggi

5 个答案:

答案 0 :(得分:2)

根据您提问的更新部分,NOLOCK很好。

答案 1 :(得分:0)

NoLock提示的问题在于,从技术上讲,当您在桌面上进行读取时,数据可能会发生变化。如果在同一时刻发生更新或插入,则您的数据可能“不正确”。根据您的情况,您可能会使用它,但您必须尝试并查看。我们一直使用它,并没有发现任何问题,但您的里程可能会根据您的情况而有所不同。

答案 2 :(得分:0)

我的建议是使用NOLOCK提示。但是,如果你不舒服,我的建议是分区表。您提到的表格大小很大。您可以对它们进行分区,然后如果更新位于不同的分区上,则读取不会与更新冲突。

答案 3 :(得分:0)

您可以查看使用Row Versioning-based Isolation Levels,例如快照隔离或使用行版本控制读取已提交的隔离。

  

基于行版本控制的隔离级别   通过改进读并发性   消除读操作的锁。

然而,随着并发性的增加,维护行版本的资源使用量增加,因此您需要确定具有这些隔离级别的应用程序的行为。

答案 4 :(得分:-2)

使用 NOLOCK 时,请同时检查this blog(不仅可以进行脏读)。