Entity Framework 4.2(コードファースト)を使用してSQL Server CE 4.0に大量のデータを挿入していますが、SQLを直接挿入する場合と比較すると、パフォーマンスが非常に低くなっています。
モデルは非常に単純です。
public class DocMember
{
public DocMember() { this.Items = new List<DocItem>(); }
public int Id { get; set; }
public string Name { get; set; }
public string MemberType { get; set; }
public string AssemblyName { get; set; }
public virtual IList<DocItem> Items { get; set; }
}
public class DocItem
{
public int Id { get; set; }
public DocMember Member { get; set; }
public string PartType { get; set; }
public string PartName { get; set; }
public string Text { get; set; }
}
挿入する2623DocMembers
と合計7747DocItems
があり、次の実行時間が得られます。
With SQL: 00:00:02.8
With EF: 00:03:02.2
EFには少しオーバーヘッドがあることは理解できますが、SQLよりも65倍遅くなります。
おそらく私のコードに問題がありますが、それは非常に簡単で、何が間違っているのかわかりません。
private TimeSpan ImportMembersEF(IList<DocMember> members)
{
using (var db = new DocEntities())
{
db.Database.CreateIfNotExists();
var sw = Stopwatch.StartNew();
foreach (var m in members)
{
db.Members.Add(m);
}
db.SaveChanges();
sw.Stop();
return sw.Elapsed;
}
}
私はまたSaveChanges
、挿入された各アイテム、または100または200アイテムごとに、役に立たないように呼びかけようとしました(実際にはさらに悪化します)。
パフォーマンスを向上させる方法はありますか、それともバッチ挿入にSQLを使用する必要がありますか?
編集:完全を期すために、SQL挿入のコードは次のとおりです:http://pastebin.com/aeaC1KcB