2012-08-11 55 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 

如果你能打破你的業務邏輯爲單獨的語句,你會發現在一個時間大大加快更新多條記錄。

如果沒有,請發佈一些更詳細的信息!