2009-07-02 97 views
2

我正在迭代LINQ到SQL類的一組實例。LINQ到SQL和批量更改提交非常緩慢

在此迭代期間,我正在進行更改,標記一些用於刪除,甚至在datacontext中插入新的。當我完成迭代時,我會啓動context.SubmitChanges() - 它可以工作,但速度非常慢。我在本地運行MSSQL 2008的快速版本。

另外,我注意到它生成的UPDATE語句,對於需要更新的行,它表示UPDATE SET ..... WHERE @p1 = ... AND @p2 = ...即所有的字段/列。我已經在表中定義了主鍵,並且在DBML模式中定義了主鍵,但它似乎仍然在UPDATE語句的所有列上進行比較,而不僅僅是主鍵。

任何想法?


更新:

我擔心的一樣,那是因爲我已經忘記了定義主鍵和桌子上的必要的索引之後更新的LINQ到SQL模式。

有問題的卷大約是40k行,我對解決方案的性能感到非常滿意。

如果數量應該增加,我會研究Marc提到的併發檢查屬性。

+0

它似乎像我的LINQ到SQL架構與數據庫架構不是最新的。更新並給它一個鏡頭。 任何想法仍然歡迎。 – Anders 2009-07-02 08:34:23

+0

想要對行數進行一些估計?就像是2000萬或8000萬? – 2009-07-02 08:37:55

回答

2

WHERE @p1 = ... AND @p2 =鏈接到併發檢查。你可以禁用這個每列,或者(更好)使用時間戳/ rowversion來代替(Yay!)。查看dbml設計器中的「Update Check」和「Time Stamp」屬性。將rowversion添加到表中並將表重新導入dbml將是我的首選選項。

我們在這裏談什麼音量?數百?成千上萬的?更多?

LINQ-to-SQL(和EF)在基於OO的基礎上進行更改,因此逐行更改。有一個限制,超越基於集合的更新是要走的路,而且你需要編寫一個存儲過程來完成所有工作。

如果你沒有使大規模的變化,但它仍然需要很長的時間,我認爲問題是缺乏適當的主鍵索引。