私はこれらのトリックでEFによって引き起こされた合計開始時間を3倍短縮することができました:
-
フレームワークを6.2に更新し、モデルキャッシュ を有効にします :
public class CachingContextConfiguration:DbConfiguration {public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}
}
-
ctx.Database.Initialize()
を呼び出します できるだけ早く、新しいスレッドから明示的に。これにはまだ3〜4秒かかりますが、他のことと一緒に発生するため、非常に役立ちます。 -
エンティティを適切な順序でEFキャッシュにロードします。
以前、私はInludeの後にインクルードを書いたところです。これは複数の結合に変換されます。いくつかのブログ投稿で「経験則」を見つけました。最大2つの連鎖インクルードEFはかなりうまく機能しますが、それぞれがすべてを大幅に遅くします。 ブログ投稿 も見つかりました 、EFキャッシングを示しました:指定されたエンティティがインクルードまたはロードでロードされると、自動的に適切なプロパティに配置されます(ブログの作成者はオブジェクトの結合について間違っています)。だから私はこれをしました:
using (var db = new MyContext())
{
db.Fields.Load();
db.Categories.Include(c => c.MainField).Include(x => x.Fields).Load();
db.FieldValues.Load();
return db.Objects.Include(x => x.MainFieldValue.Field).ToArray();
}
これは、質問からのインクルードよりも6倍高速にデータをフェッチしています。エンティティが以前にロードされると、EFエンジンは関連するオブジェクトのデータベースを呼び出さず、キャッシュからそれらを取得するだけだと思います。
-
これもコンテキストコンストラクターに追加しました:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
その影響はほとんど目立たないものですが、膨大なデータセットに対してより大きな役割を果たす可能性があります。
これ も見ました RowanMillerによるEFCoreのプレゼンテーションと、次のリリースでそれに切り替える予定です。場合によっては、EF6よりも5〜6倍高速です。
これが誰かに役立つことを願っています