私が直面しているパフォーマンスの問題を掘り下げるためにアプリケーションをトリミングした後、私は非常に基本的なデータモデルを持っています。データモデルは、callend ProductとCategoryの例のように、2つのエンティティで構成されています。
class Product {
public virtual int ID {get;set;}
public virtual string Name {get;set;}
public virtual int CategoryID {get;set;}
public virtual Category Category {get;set;}
}
class Category {
public virtual int ID {get;set;}
public virtual string Name {get;set;}
}
カテゴリIDプロパティを使用してすべての参照が同じカテゴリに設定されている100個の新製品を追加し、db.SaveChanges()を呼び出すと、かなり時間がかかる場合があります。AutoDetectChangesEnabledをfalseに設定することで、必要な時間を短縮することができました。しかし、さらに2、3回実行した後、データベースに存在する製品の量が増えると、100個の新製品を挿入するのに必要な時間が増えることに気付きました。
23416 --> +/- 7000 ms
25516 --> +/- 7500 ms
実稼働環境ではテーブルが大幅に大きくなることがわかっているので、生のSQLクエリまたはBulkInsertの使用にフォールバックする前に、オプションが何であるかを知りたいと思います。
スタンリーとラファエルのコメントに応えて:
私のテストケースでは、両方のIDプロパティが主キーであり、CategoryIDにはインデックスがあります。トリガーなどはありません。
ループを100回実行しています。このループでは、新しいDbContextを初期化し、100個の製品を挿入して、DbContextを破棄します。
明確にするために:新しいプロジェクトを作成し、SqlCeでEFをセットアップし、Code-Firstを使用して上記のように文字通りデータモデルを構築し、同じ結果を得ることができます。
他のいくつかのテストを行った後、問題はSql ServerCompactEditionにあるようです。通常のMSSQLサーバーを使用すると、オブザーバーのパフォーマンスの問題が解消され、100行の挿入に一貫して約50ミリ秒かかります。問題の原因はわかったようですが、外部クエリツールを使用してコンパクトデータベースに100行を挿入しても、EFを使用して100行を挿入した場合と同じパフォーマンスの問題が発生しない理由はまだわかりません。