2016-01-14 157 views
0

我正在使用實體框架來調用存儲過程。我有一個場景,這個過程被稱爲3000次,然後對於這3000個存儲過程調用中的每一個,另一個存儲過程將被調用1到100次。大約需要20分鐘。我想把那段時間減半。有什麼我可以做的,以優化這個?存儲過程對大插入/更新使用實體框架

基本上這是發生了什麼事:

foreach (var parentObject in parents) //parents.count = 3000 
{ 
    int id = _efContext.prInsertParent(parentObject.Name, parentObject.values, etc..); 

    // Have to get SCOPE_IDENTITY() id to be able to add children 
    foreach (var child in parentObject.Children) //children count up to 100 items 
    { 
     _efContext.prInsertChild(id, etc..othervalues); 
    } 
} 
+0

就個人而言,我會重新考慮架構。 3000個存儲過程調用不應該被接受,並且在額外的100個調用受到指數影響時更是如此。那麼,最壞的情況下,30萬電話? – DvS

回答

0

正如我所說的在我的評論,我會重新考慮你的架構。

  1. 考慮利用您的數據庫的力量。將數據插入臨時表中,然後在此之後進行處理。例如,爲父 - 子關係使用臨時GUID。
  2. 使用一些大容量複製機制,例如可從NuGet獲得的EntityFramework.BulkInsert,或者甚至是作爲.Net框架一部分的標準SqlBulkCopy類型。
0

當你插入數據...數據必須以某種方式得到.. 我會嘗試將這些設置爲false ..在插入..之前,看看你得到什麼。

Configuration.AutoDetectChangesEnabled = false; 
    Configuration.ValidateOnSaveEnabled = false; 
+0

這些配置是否僅適用於實際實體(POCO)?我只是調用存儲過程 – TMan

+0

你是對的..我想知道大部分時間花在插入。假設你必須通過網絡驅動它?它是短暫的時間..你可以嘗試將所有的數據猛擊到某種字節數組並壓縮它並將其作爲parm發送。然後讓SP在另一側解開它並在其中執行所有插入..(假設您的數據庫sp可以處理這些事情.. – DaveTheRave

+0

我不確定您是否希望在應用中維護結構和ID的帖子插入 – DaveTheRave