2015-06-29 53 views
0

需要從oracle下載大量數據(每日),然後刪除sql server上的數據(重新運行的情況下),然後將數據粘貼到帶有sqlbulk副本的sql server中。非平行版本:加速通過並行.for

 for (int i = 0; i < curves.Rows.Count; i++) 
     { 
       //download data from oracle 
       var data = GetCurve(connectString, impdate, curves.Rows[i]); 
       //delete old data in sql server 
       DeleteSQL(DateTime.Now, curves.Rows[i]); 
       //write to sql server with sqlbulk.copy 
       writeCurve(data, "dbo.t_Curves"); 
} 

我想加快使用parallel for,但顯然這些步驟是相互依賴的。這是我想出來的(我以前從未使用任務工廠):

Parallel.For(0, curves.Rows.Count, i => 
     { 
       var taskLoad = Task.Factory.StartNew(() => GetCurve(connectString, impdate, curves.Rows[i])); 
       var taskDelete = Task.Factory.StartNew(() => DeleteSQL(impdate, curves.Rows[i])); 
       taskDelete.Wait(); 
       taskLoad.Wait(); 
       var taskWrite = Task.Factory.StartNew(() => writeCurve(taskLoad.Result, "dbo.t_Curves")); 
    }); 

這大概減半了時間。我可以期待的時間減半了嗎?這是線程的正確使用嗎?這是我能做的嗎?我可以加入任何進一步的加速嗎?

UPDATE

只是爲了信息,曲線是定義一個DataTable和我不是寫或逐行讀取任何行。

或者我應該寫這樣的:

Parallel.For(0, curves.Rows.Count, i => 
     { 
       var taskLoad = Task.Factory.StartNew(() => GetCurve(connectString, impdate, curves.Rows[i])); 
       var taskDelete = Task.Factory.StartNew(() => DeleteSQL(impdate, curves.Rows[i])); 
       var res1 = await taskDelete; 
       var res2 = await taskLoad; 
       writeCurve(res2, "dbo.t_Curves"); 
    }); 
+0

@Silvermind:不,我希望它儘可能快,我真的不知道我是否正確使用了taks工廠,我從未使用過它(我猜數字只是表示加速,也許減半時間是我能期待的嗎?) – nik

+2

我不認爲你需要爲寫作部分啓動一項任務,因爲你只是希望它在加載和刪除任務完成後運行。 – juharr

+0

@juharr:好點,這很有道理 – nik

回答

1

問:這是正確使用線程的?

答:是的,你正在做兩個單獨的任務昂貴的工作,然後等待他們完成之後繼續。對@ jugarr肯定+1,指出你不需要另一個任務來完成最後一點工作

問:這是你所能做的嗎?

*大概沒有,從你在做什麼聲音,你是

  • 在MSSQL
  • 獲取單行(甲骨文)
  • 刪除單個行(如果它已經存在)
  • 添加單列回MSSQL

一些建議:

  • 批註起來,不要一次只使用一行。
  • 簡介最慢的部分是檢索數據,刪除它還是插入?它可能是這樣的:
    • 使用單行,啓動 新連接的開銷可能很大。這可能是因爲想嘗試刪除,因爲參照完整性

你得到什麼吞吐速率的數據時,檢索數據

  • 缺少索引時
  • 缺失索引?多少MB/s?每條曲線是1MB還是1GB?

  • +0

    非常感謝您的回答。實際上,我一次從oracle加載整個曲線(最多25000行)爲datatable,然後使用sql批量複製插入。我的代碼中的行引用數據表的一行,其中包含查詢的定義 – nik

    +0

    does task.result include task.wait()使taskLoad.Wait()成爲多餘的? – nik