8

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

4

2 に答える 2

6

バルクデータをロードするために私のSqlCeBulkCopyライブラリを使用できます。これはSqlBulkCopyAPIを模倣しています:http ://sqlcebulkcopy.codeplex.com

于 2012-01-24T07:25:47.167 に答える
1

インサートをバッチ処理していないため、低速です。

データベースにIDを使用して挿入する場合、モデルに割り当てる各アイテムの後に結果IDを選択する必要があります。これは本当に遅くなります。

アドホックSQLはIDを選択していないため、バッチ処理すると、すべてのステートメントを一度に送信できます。

NHibernateで書かれたAltho:

http://www.philliphaydon.com/2011/09/the-benefits-of-letting-the-orm-generate-the-identity-part-1/

ORMで生成されたIDとSQLで生成されたIDの使用について書きました。

于 2012-01-24T00:09:14.123 に答える