我有一组非常大的数据(〜300万条记录),需要在日程中与更新和新记录合并。我有一个存储过程,实际将记录设置为1000个记录块,并使用Temp表的MERGE命令尝试避免在数据更新时锁定实时表。问题是它并没有完全有帮助。桌面仍然“锁定”和我们的网站使用数据在尝试访问数据时接收超时。我甚至尝试将其分成100个录制块,甚至尝试了一个WAITFOR DELAY '000:00:5',看看它是否有助于暂停合并块。它仍然是相当迟缓的。

我正在寻找有关如何在不锁定表的情况下合并大集数据的任何建议,最佳实践或示例。

感谢

有帮助吗?

解决方案

在执行选择时,更改前端以使用NOLOCK或读取未提交的读取。

您无法使用Nock合并,插入或更新,因为必须锁定记录以便执行更新。但是,您可以编号选择。

请注意,您应该谨慎使用。如果脏读数没问题,那就前进了。但是,如果读取需要更新的数据,那么您需要缩短不同的路径并确切地弄清楚合并3M记录导致问题的原因。

我愿意打赌,大多数时间都在合并命令期间与磁盘读取数据和/或在低内存局势上工作。您可能会更好地将更多RAM填充到数据库服务器中。

理想的数量是有足够的RAM将整个数据库拉入内存时。例如,如果您有4GB数据库,则确保您在X64服务器中有8GB的RAM。

其他提示

我担心我的经历相当。我们正在执行更新和插入,其中源表只有数百万的目标表中只有一分的行数。

当我们组合整个操作窗口的源表记录然后执行一次合并后,我们看到的性能增加了500%。我的解释是,您正在为Merge命令支付一旦对Merge命令的正面分析,而不是在紧密的循环中再次遍及。

此外,我确定将1600万行(源)合并为700万行(目标),而不是400行进入7000行以上超过4000行(在我们的情况下)利用SQL Server引擎的能力好多了。同样,在分析两个数据集的分析中,这是一个公平的工作,这仅完成一次。

我要问的另一个问题是嗯,你是否知道合并命令在源表和目标表上的索引中更好地执行更好?我想引用以下链接:

http://msdn.microsoft.com /en-us/library/cc879317(v=sql100).aspx

从个人体验中,合并的主要问题是,由于它确实锁定它排除了指向表的插入件中的任何并发性。所以如果你走下这条路,你就是你批量在单个作家中击中表的所有更新都是基本的。

在0.4秒或甚至512中插入256条目0.5秒,我们用负载发电机测试了这一切,似乎都很好,直到它命中生产,并且在页面锁上的所有内容被阻止到地狱,导致总吞吐量远低于单个插入。

解决方案是不仅在合并操作中批量来自单个生产者的条目,还通过额外的队列级别批量从生产者批量到单个合并操作中的单个数据库(先前还为单个连接每DB,但使用火星对所有生产者进行交互来调用实际合并事务的存储过程),这种方式我们能够在没有问题的情况下处理每秒数千个插入。

在所有前端读取的所有前端读取中都必须始终如一。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top