sql >> データベース >  >> RDS >> Sqlserver

EFの起動が非常に遅い-15分

    私はこれらのトリックでEFによって引き起こされた合計開始時間を3倍短縮することができました:

    1. フレームワークを6.2に更新し、モデルキャッシュ を有効にします :

      public class CachingContextConfiguration:DbConfiguration {public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}

      }

    2. ctx.Database.Initialize()を呼び出します できるだけ早く、新しいスレッドから明示的に。これにはまだ3〜4秒かかりますが、他のことと一緒に発生するため、非常に役立ちます。

    3. エンティティを適切な順序で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エンジンは関連するオブジェクトのデータベースを呼び出さず、キャッシュからそれらを取得するだけだと思います。

    1. これもコンテキストコンストラクターに追加しました:

          Configuration.LazyLoadingEnabled = false;
          Configuration.ProxyCreationEnabled = false;
      

    その影響はほとんど目立たないものですが、膨大なデータセットに対してより大きな役割を果たす可能性があります。

    これ も見ました RowanMillerによるEFCoreのプレゼンテーションと、次のリリースでそれに切り替える予定です。場合によっては、EF6よりも5〜6倍高速です。

    これが誰かに役立つことを願っています




    1. 作業フォルダを使用したソース管理データベース

    2. phpmysqlクエリエンコーディングの問題

    3. mysqlnodejsのIN句

    4. PDO fetch()は失敗時に例外をスローしますか?