C#EFの最適化

オリジナルます。https://www.cnblogs.com/wangyuliang/p/10338902.html

     https://www.cnblogs.com/simadi/p/6879366.html

今の仕事はほとんどのSQLネイティブに使用されず、ほとんどの時間は、EFを使用しています。最初は、単に機能、最近やってサーバ・インタフェースの開発を達成することに焦点を当てています。現像時間は食事をパチパチキーボードインターフェイスラインが、悲劇の時のFBIテストにseconds秒をノック、以前のようにあります。そしてマナは、クライアントが何をしている「最前線に置く足をキャッチします。」訪問数と強化の両方桁に、以前のポイントいくつかの最適化を終え、自分の練習の経験Baiduは、Googleによると、この時点で問題が露出しているとはみなされません。偉大な神は、あなたが修正を批判歓迎します!

1. AsNoTracking()、無トラッキングクエリ、データは、検索をスピードアップすることができ、変更することができません

読み取り専用操作のために、それは強くEFコンテキストを訪問するために、データ収集のためのAsNoTrackingを使用するので、時間を節約することが推奨され、それが大幅にデータを取得するために必要な時間を短縮します。

そしてので、キャッシュを追跡することによって、何のコンテキストが存在しないため、データはタイムリーなデータクエリのための一定の高適時要件により助長、これまでに行われています。

db.Person.Where(a => a.IsDeleted == false).AsNoTracking().ToList(); 

 

遅延読み込みの2合理的な利用。

データがナビゲーション属性に満たない場合は、ライン上の遅延ロードを使用し、メモリに不要なデータをロードしません。データは、foreachのナビゲーションプロパティで使用される場合、すべてのデータがロードされると、複数のforeach内のデータベースと相互作用することを防止()メソッドを含めることによってしかしながら、最良は、遅延ロードを無効にします。もちろん、通常の状況下では、特定のものが支配的な事業環境に応じて決定されるようなものです。

 

3.リストは、使用回数()> 0を回避するために、任意の()を使用するのが最適です、それはデータが含まれているかどうかを決定するので、Lowモードでは、力が本当に遅いああです。

 

4.ときにWHERE句ファジーマッチング値で漢字、プラス(「文字を一致させるために」)DbFunctions.AsNonUnicodeを使用することを忘れないでください。

     VaRのクエリ= db.User.Where(A => a.Name == "makmong")ToListメソッド()。

 修改后:VAR クエリ= db.User.Where(A => a.Name == DbFunctions.AsNonUnicode("makmong"))ToListメソッド();。

5. [並べ替えのエラー()エラーがソートされた原因を使用します。

複数のフィールドまでの時間は、右の組み合わせのようなものは、のOrderBy()ThenBy()がいる。そうではない、ああ覚え..のOrderBy()のOrderBy()、これだけ最終的に合わせて、あなたが望む効果を達成するためにソートフィールドのその種。

 

 6.ページング真と偽の質問

LINE1:query.ToList()スキップ((pageIndexパラメータ- 1)*がPageSize).Take(がPageSize)。

LINE2:query.Skip((pageIndexパラメータ- 1)*がPageSize).Take(がPageSize).ToList();

LINE1は、タブを追加メモリとページングのすべてのDBのデータから削除され、実際のLINE2]タブ。いいえToListメソッド()は、値型を返さないか、のIQueryable <T>、ToListメソッド()の実装は、その後、データベースに直接問い合わせる、直接戻り値の型は<T> IEnumerableをです。

 

7.オンデマンドコラムロードの一部。

ViewModelに代わりエンティティモデルの推奨

次に、新しいViewModelに

public class UserViewModel { public int Id { get; set; } public string Name { get; set; } } 

クエリを開始します。

var query = db.User.Select(a=>new UserViewModel()
{
    Id = a.Id,
    Name = a.Name }).ToList(); 

 

バイトenum型を使用したモデルエンティティ

我々は、TINYINT、SMALLINT、INT、BIGINT下のSQLServerの違いを理解するために開始します

  • BIGINT:-263(-9223372036854775808)263から1(9223372036854775807)整数データに対して、記憶サイズは8バイトです。バイトは8で、その後、64 bigint型があります

  • INT:-231(2,147,483,648)整数データ231から1(2,147,483,647)に、4バイトの記憶容量。int型は、最大32ビットのデータを記憶することができます

  • SMALLINT:-215(-32,768)215から1(32,767)整数データに対して、記憶サイズは2バイトです。SMALLINTは16を持っていることです

TINYINT:0から255までの整数データ、ストレージサイズが1バイトです。TINYINT 8があります。

そう値比較的短い長さの一部の範囲で、例えば、列挙型、あるいはデータ・ストレージを節約するために、対応するタイプのTINYINTデータベースを生成する、バイトint型を使用することができます。

以下のような:

public CouponType CouponType { get; set; }
public enum CouponType : byte {  RedBag = 0,  Experience = 1,  Cash = 2,  JiaXiQuan = 3 } 

8.拡張Entity FrameworkのExtendedsのバッチ挿入および削除の操作は、データベースのSQL文と、複数の相互作用の多数の発生を回避します。

 Nuget ****安装PM>インストール・パッケージEntityFramework.Extended

 

9.これらは、パフォーマンスを行うかどうか?SQLQueryは、()、または記憶過程を通じて、発行部などのSQL文を複数、それによって性能を向上させる、データベースとの相互作用の数を減らすことができます。

問題は、次の措置により最適化することができ、初めてEFスロースタート:

アプリケーションを事前にウォームアップに初期化されると、問題の1.EFを予熱。たとえば、次のようにMVCアプリケーションは、グローバルファイルを追加することができます。

コードをコピー
保護のApplication_Start()無効
{ 
    使用(VAR新しい新規mcccEntities CTX =())
    { 
        ; VARのObjectContext =((IObjectContextAdapter)CTX).ObjectContext 
        するvar mappingCollection =(StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); 
        mappingCollection.GenerateViewsを(一覧表示新しい新しい<EdmSchemaError>()); 
    } 

いくつかのDB接続がそれを使用して、いくつかを記述する必要があり、覚え//。

}
コードをコピー

 

SQLライブラリの操作を使用してEF分

データベース内のテーブルとデータが一定のサイズに達すると、我々は、サブ最適化されたライブラリ、最適化されたサブテーブルクラスアクションがあると思います。

ADO.NETの前のサブライブラリーのために非常に一般的な操作です。

例えば、以下の非クロスデータベースクエリ:

SELECT Name FROM dbo.User WHERE ID=1 

クロスデータベースクエリ:

SELECT Name FROM MaiMangAdb.dbo.blog_PostBody WHERE ID=1 

私たちは、EF DbContext'veは、接続文字列を指定したことを知っています

public EntityDB() : base("DefaultConnection") 
<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=EFStudy;Integrated Security=True;" providerName="System.Data.SqlClient" /> </connectionStrings> 

つまり、すべてのコンテキスト操作が動作するように、このデータベースに基づいており、我々は、データベースを操作するために複数のリンクを持つ複数のクエリのADO.NETセットを使用することはできませんです。

もちろん、メソッドのセットが、また、簡単なを与えている偉大な神。私もそれを移植するために直接記録します。

シノニムシノニム方法は、私はこのケースで実証し、データベースに追加することです

二つのテーブルのユーザーおよびロールモデルを作成します。

public class User { [Key] public int Id { get; set; } public string Name { get; set; } public bool IsDeleted { get; set; } [DateTime2Precision] public DateTime CreateDateTime { get; set; } } public class Role { [Key] public int Id { get; set; } public string Name { get; set; } } 

そして、の文を追加します。

EntityDB db = new EntityDB();
db.User.Add(new User { Id = 1, Name = "ddd" ,CreateDateTime = DateTime.Now}); db.Role.Add(new Role() {Id = 1, Name = "admin"}); db.SaveChanges(); 

Viewデータベースの実行:

今、私たちは、データベースの形式と内容を持っています。Userテーブルと、私は、現在のEFの動作に影響を与えることなく、別のデータベースへコンテンツを移行するつもりです。

新しいデータベースを作成し、一貫したユーザテーブルユーザーEFSYNONYM、テーブル構造とEFStudyを追加します。

 

その後EFStudyは、ユーザーテーブルを削除し、シノニムを作成します

CREATE SYNONYM [dbo].[Users] FOR [EFSYNONYM].[dbo].[Users]

この場合、ユーザーおよびロールは、すでに別のデータベースの内部に存在している、我々は、クエリデータ操作を挿入します

 

サブライブラリーのこれまでのところ成功。もちろん、この方法も欠点が実際に(プライマリ外部キー関係に関連付けられた同義語によって確立することができないライブラリとプライマリ・テーブルの間で分割された、データがなく、別の関節結合問合せ複数のクエリ速いなどの特定のレベルに達すると、

そして、その同じ文脈ので、影響力を持っている、データ接続によって、あまりにも心配していないいくつかの回を切り替え、すべてが)長所と短所は最高がそれではない持っている必要があります持っているので、我々は、単一のデータ・テーブルに移行するために、いくつかの独立した期限切れの簡単を置くことができます経営を助けるだけでなく、クエリの最適化を助長するデータベース、。

おすすめ

転載: www.cnblogs.com/zhang1f/p/11409154.html