Performance 避免在大量读取的表上锁定的最佳实践?

Performance 避免在大量读取的表上锁定的最佳实践?,performance,sql-server-2008,locking,Performance,Sql Server 2008,Locking,我有一个大数据库(~4GB),有两个大表(~3M条记录),每小时约180K次选择,每小时约2k次更新,每小时约1k次插入+删除 在插入/更新/删除时,确保阅读任务不被锁定的最佳做法是什么 我在考虑使用NOLOCK提示,但是关于这一点讨论太多了(这取决于它是好是坏),所以我有点迷路了。我必须说,我已经在开发环境中尝试过了,我没有发现任何问题,但我不想把它投入生产,直到我得到一些反馈 更新:我在收到评论后澄清了这一点——由于处理此应用程序的业务,我不介意所选记录是否因同时被删除/更新而过时。下一个r

我有一个大数据库(~4GB),有两个大表(~3M条记录),每小时约180K次选择,每小时约2k次更新,每小时约1k次插入+删除

在插入/更新/删除时,确保阅读任务不被锁定的最佳做法是什么

我在考虑使用NOLOCK提示,但是关于这一点讨论太多了(这取决于它是好是坏),所以我有点迷路了。我必须说,我已经在开发环境中尝试过了,我没有发现任何问题,但我不想把它投入生产,直到我得到一些反馈

更新:我在收到评论后澄清了这一点——由于处理此应用程序的业务,我不介意所选记录是否因同时被删除/更新而过时。下一个read将返回新的,这很好

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

谢谢大家!!
Luiggi

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

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

根据您问题的更新部分,NOLOCK没有问题。

您可以查看使用快照隔离或使用行版本控制的读取提交隔离

基于行版本控制的隔离级别 通过 消除读取操作的锁


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

您的用例是否可以接受脏读?是的,在这种情况下,脏读不是问题。我不知道是否“试试看”当谈到锁定时,这是最好的建议-仅仅因为它在前10000次工作并不意味着它在第10001次工作。。。更好地理解NOLOCK将产生什么样的影响,以及您是否关心您的读取是否有点不准确。在这种情况下,我不介意在一次读取时读取旧数据,然后在下一次读取时获取新数据。请阅读我对这个问题的一些澄清。你觉得呢?也许两种方法的结合会很有趣?因为既然您提到了它,我当然可以根据“lastUpdated”列对表进行分区。当一个记录被插入或更新时,它很可能保持完整至少一个月。