移行を実行していて、SQLサーバーからデータを取得しようとしたときにパフォーマンスが低下することがありました。私のやり方は次のとおりです。SQLクエリでOutOfMemoryExceptionが発生し、SQL Serverから大量のデータが取得される
ctx.ExampleEntity.Database.SQLQuery<ClassConverter>("Select....")
ClassConverter
はExampleEntity
とは関係を持たないクラスです。問題は、そのクエリから1.5百万以上のレコードが取得され、リストを作成しようとするとOutOfMemoryException
がスローされ、それを回避できないということです。
これはEF 6.0です。
///////////////////////////////////ソリューション
まゆからの回答後、私はこのコードを書いていますが、1Mでは例外がスローされません。 sqlは最終的なDBにないレコードを返します。
List<ClassConverter> listRowsToInsert = new List<ClassConverter>();
int countRecords=-1;
int skipCount = 0;
while(countRecords!=0){
List<ClassConverter> listIndivInsert = genEntitAgp.Database.SqlQuery<ClassConverter>(File.ReadAllText("sql/limitPfm.sql")).Skip(skipCount).Take(1000000).ToList();
countRecords = listIndivInsert.Count();
listRowsToInsert.AddRange(listIndivInsert);
if (countRecords < 1000000)
countRecords = 0;
skipCount += 1000000;
}
すべて
一度に何百万ものレコードが本当に必要ですか? – mason
コールをバッチに分割しますか? –
リレーションがない場合、クロスジョインが返される可能性があります。つまり、1つのテーブルのすべてのローが2番目のテーブルのすべてのローに関連付けられていることを意味します。各テーブルに1000行がある場合、1,000,000行が返されます。任意の種類の結合を行っておらず、表の行数が150万にすぎない場合は、遅延フェッチまたはバッチでフェッチするか、フィルタリングする必要があります。 – pmbAustin