2012-08-11 73 views
0

我有一个大的循环,更新2,800,000条记录访问数据库,我把循环分成7个线程,因此每个线程在400,000条记录上工作,循环大约需要0.7秒来更新一条记录因为有很多计算需要完成。访问数据库上的VB.NET多线程

我确定这些线程有助于使进程更快,因为我测试了7200RPM HDD和SSD以及ramdisk上的应用程序,速度差别并不明显,所以IO不是瓶颈。

我想第一个线程处理第一个400k记录和第二个线程来处理下一个400k记录等等。

- 什么是正确的方法来做到这一点?

- 是否每个线程都有自己的数据表和绑定源?

- 如何将结果合并到一个表中,并在流程完成时将其显示在datagridview中?

+0

这是一次性操作吗?如果是这样,为什么要编写一个线程方法呢?如果不是,如果您必须定期更新280万条数据库记录,是否会成为糟糕设计的暗示?如果不是,可能Access首先使用的是错误的技术?无论如何,这个问题表明与线程访问数据库不同的问题。 – Tomalak 2012-08-11 12:36:08

+0

手术每3个月进行一次 – user1590636 2012-08-11 12:37:40

+0

我之前的评论中还有其他一些问题,请谨慎回答?另外:是一个集操作('UPDATE Table SET Field = CalculatedValue()')不可能?请注意,您可以在Access SQL语句中使用VBA中的用户定义函数。此外:需要多长时间*现在*?请注意,使用七个线程不会将速度提高七倍。 – Tomalak 2012-08-11 12:42:11

回答

1

访问数据库只是一个文件。在阅读和写作的过程中,你会遇到瓶颈,除此之外,还有很大的可能性会像这样做。想象一下,用数据的xml文件做同样的事情。

全部取决于你对数据做了什么。 如果对任何键或索引中的任何列都没有更改,并且并非所有记录都会读取/更改。然后一个线程读取和写入一个池来处理可能会让你在某个地方。处理过程必须足够重要,才能让它值得旋转多个线程。因为它们会在磁盘io上等待,除非它有相当数量。 如果您的索引会发生变化,您不必在操作中使用它们。放下它们,然后再把它们放回去。

如果你正在为数据显著的变化,那么也许从现有的数据库

一个读线程 然后创建七(可能要基于处理器的明智的数目调整该) 与眼前这个空数据库在它的表 从父母读取,扔进一个处理器池(如果它值得拥有一个),然后写入其中一个“七个”副本 然后清除原来的数据并将数据写回其他人(串行和把它放在一起)

所有说的drop access,使用全DBMS,因为哟你可能会看到你期望的一些改进。

平行处理时需要注意的事项。瓶颈在哪里?在你的情况可能是磁盘IO,多个线程没有解决这个问题,你只是结束了七个线程旋转他们的拇指等待磁盘驱动器。

+1

SQL Server数据库只是一个文件。这个说法毫无意义。将Access数据库与XML文件进行比较也是一个非常大胆的说法。 – Tomalak 2012-08-11 12:50:37

+0

访问完整的dbms卷文件是由服务器控制的,访问mdb的访问(无双关语意义)是通过标准操作系统读/写与xml文件或甚至文本文件不同的方式完成的。就OP而言,实现这一目标意味着什么。这与结构和复杂性无关,与7个用户读取和写入同一文件相当。 – 2012-08-11 12:56:08

+0

IO不是问题,因为我使用RamDisk – user1590636 2012-08-11 12:57:06

1

我建议试图从另一个角度来攻击这个。循环播放这些记录并单独更改它们总是会变得很慢。

我建议你尝试发行更新语句,一次更新许多记录,并尝试通过将其分解为逻辑语句来封装业务逻辑。例如:

UPDATE stock SET retail = 0.95 WHERE retail < 1.5 
UPDATE stock SET retail = 1.95 WHERE retail >= 1.5 and retail < 2.5 
UPDATE stock SET retail = 2.95 WHERE retail >= 2.5 and retail < 3.5 
UPDATE stock SET retail = 3.95 WHERE retail >= 3.5 and retail < 4.5 
UPDATE stock SET retail = 4.95 WHERE retail >= 4.5 and retail < 5.5 

如果你能打破你的业务逻辑为单独的语句,你会发现在一个时间大大加快更新多条记录。

如果没有,请发布一些更详细的信息!