2010-04-13 75 views
1

我在java中有一個數據存檔過程,它在db2和sybase之間移動數據。僅供參考 - 這不是通過任何導入/導出過程完成的,因爲在運行時每個表上有幾個條件,所以這個過程是用java開發的。db2中的Oracle rownum - Java數據存檔

現在我有單個DatabaseReader和DatabaseWriter爲每個源和目標組合定義,以便數據在多個線程中移動。我想我想進一步擴展這一點,我可以爲每個源和目標組合定義多個DatabaseReaders和多個DatabaseWriters。

因此,例如,如果源數據是大約100行,並且我定義了10個讀取器和10個寫入器,則每個讀取器將讀取10行並將它們提供給寫入器。我希望進程能夠根據服務器上可用的資源[CPU,內存等]給予我極高的性能。

但我想問題是這些源表沒有主鍵,並且抓取多個集合中的行非常困難。

Oracle提供了rownum概念,我猜那裏的生活要簡單得多....但db2怎麼樣?我如何用db2實現這種行爲?有沒有辦法說取前10條記錄,然後取下10條記錄等?

任何建議/想法?

DB2版本 - DB2 v8.1.0.144 修訂包民 - 16 Linux的

+0

您能確定您使用的DB2的平臺和版本嗎? – 2010-04-14 04:44:41

+0

我現在加了它... – jagamot 2010-04-14 13:24:06

回答

-1

DB2確實支持ROWNUM概念。不知道你的數據庫架構,這是一個例子:

SELECT * 
FROM (
    SELECT rownumber() OVER (order by column1, column2) AS number, column1, column2 
    FROM mytable 
) temp 
WHERE number BETWEEN 20 AND 30 

這裏的子查詢獲得在表的每一行,並ROWNUMBER功能是根據指定的順序分配。 「外部」查詢可以使用rownumber來選擇您實際想要批處理的行。

+0

壞主意!rownunber函數根據當前選中的行計算行號 - 它是在選擇處理期間計算的,因此它不可重複且涉及額外的處理。 – 2010-04-29 04:59:18

0

如果我理解正確,您只是試圖以10行的批次寫入目標表。沒有必要將讀取批量分成10行。

只需啓動select語句,然後繼續讀取,直到數據用完。 每10行可以調用作者。然而,大多數jdbc客戶端會在封面下執行這種優化,所以這可能不會比插入一行更好。我很懷疑,多線程的實現會加快速度,因爲無論如何,目標數據庫引擎正在完成大部分工作,並且它將受到日誌寫入和鎖定的限制,而多線程無法幫助(或者更糟糕!)。 。

就我所見,一個簡單的單線程「選擇」/「插入」過程將輕鬆超越您的多線程程序。還有其他方法可以對此進行優化: -

  1. 調整您的數據庫客戶端,以便網絡操作進行批處理。
  2. 檢查您的「COMMIT」處理,以便您在每隔100次左右插入後進行提交。