這屬於我正在繼承的項目,不能更改表結構或數據訪問模型。我被要求優化用於將數據插入數據庫的算法。用於合併數據的實體框架算法
我們在表T從這個數據集,我們拉了一套我們稱之爲答:我們也查詢XML提要並獲得了一套我們稱之爲X.
- 如果從X的值在A中,記錄在A中必須更新以反映X.record的數據
- 如果X中的值不在A中,則X.record必須插入到A中
- 如果來自A的值不在X中A.record必須保存在A中
- X必須完全遍歷所有記錄,並且A必須更新
所有這些更改都需要插回到數據庫中。
AS的算法中執行以下操作:
Query XML into a LIST
foreach over the XML LIST
look up foreach.item in A via LINQ (i.e. query = from record in A where
record.GUID == foreach.item.GUID
select record)
if query.Count() == 0
insert into A (via context.AddToTableName(newTableNameObject)
else
var currentRecord = query.First()
set all properties on currentRecord = properties from foreach.item
context.SaveChanges()
我知道這是次優的。我試圖將A轉換成foreach循環之外的一個對象(稱爲queryA),以便將查詢移動到內存中而不是擊中磁盤,但是在思考完後,我意識到數據庫已經在內存中。
在計算器中添加了定時器對象後,很明顯最耗時的是SaveChanges()函數調用。在某些情況下,它是20ms,而在另一些情況下,可以明確地說,它會跳到100ms。
我寧願只調用一次SaveChanges()。鑑於我對EF的深入瞭解(最好是薄的)以及無法更改表格結構以及必須保留A中不包含X的數據的限制,我無法弄清楚該怎麼做。
對此提出建議?
您提到您無法更改數據訪問模型。所以無法批量插入扁平化的XML並在目標數據庫中運行MERGE? – 2011-05-09 23:16:59