1

我有一個SQL表,其中有大約1億行左右的SQL表,並且它的模式由EF遷移管理。在EF遷移中更新大量數據

我想更改鏈接到該表的枚舉值,所以我需要將數據庫中的所有值更新爲新值。像下面的東西。

this.Sql("UPDATE MyTable SET MyEnum=0 WHERE MyEnum=-1"); 

這將是所有的好上一個較小的表,但因爲表的大小它不是真的適合在一氣呵成運行這樣一個大的更新(我得到的連接超時,tempdb的空間問題,事務日誌空間問題等)。分批做這件事情會更好。例如:

while(ctx.MyTable.Any(m =>m.MyEnum == -1)) 
{ 
    this.Sql("UPDATE TOP (1000000) MyTable SET MyEnum=0 WHERE MyEnum=-1"); 
} 

不幸的是我不能在遷移過程中摸出一個方式從表中讀取(例如,如何可以在遷移過程中ctx.MyTable.Any(m =>m.MyEnum == -1)做到這一點)。有沒有辦法做到這一點,以便我可以在EF遷移更新中進行批處理。

回答

-1

我的建議是基於確切知道EF對你有多慢(即使是分批進行),你會創建一個存儲過程來完成你想做的事,然後只是遷移時只需調用該存儲過程即可。它應該,希望能快速運行,因爲一切都將在SQL的一面完成。

+0

我已經在運行一個原始的SQL更新(根本不是EF),一個SP很容易出現同樣的問題,因爲它在超時時間內不會完成,並且在執行時會使用大量的log/tempdb空間。 – 2014-10-28 20:28:34