次の .NET EF Core パフォーマンス チューニングを使用すると、クエリのパフォーマンスが急上昇します

1. ループ内でのクエリ操作を避ける:

ループ内でのクエリ操作を回避するには、クエリ結果をメモリにキャッシュし、メモリ内のデータを操作して、パフォーマンスを向上させることができます。この方法は、少量のデータでデータを収集するのに適しています。それ以外の場合は、利点が欠点を上回ります。

// 不建议的方式:在循环中进行查询操作
foreach (var item in itemList)
{
    var result = context.Items.FirstOrDefault(i => i.Id == item.Id);
//执行逻辑
}
// 推荐的方式:将查询结果缓存到内存中,然后对内存中的数据进行操作
var itemIds = itemList.Select(i => i.Id).ToList();
var results = context.Items.Where(i => itemIds.Contains(i.Id)).ToList();
foreach (var item in itemList)
{
    var result = results.FirstOrDefault(r => r.Id == item.Id);
    //执行逻辑
}

 

2. 遅延読み込みの使用を避ける:

ナビゲーション プロパティにアクセスするたびに追加のデータベース クエリがトリガーされるため、遅延読み込みは使用しないでください。明示的な読み込みまたは一括読み込みの手法を使用すると、パフォーマンスを向上させることができます。

// 不建议的方式:使用懒加载
var order = context.Orders.FirstOrDefault();
foreach (var item in order.Items)
{
  //执行逻辑
}
// 推荐的方式:使用预先加载
var order = context.Orders.Include(o => o.Items).FirstOrDefault();
foreach (var item in order.Items)
{
   //执行逻辑
}

 

3. Include メソッドを合理的に使用します。

Include メソッドは、関連するすべてのエンティティ オブジェクトを 1 つのクエリで取得できます。ただし、大量のデータが含まれる場合、Include メソッドはパフォーマンスの低下を引き起こす可能性があります。Include メソッドの代わりに、手動のリンク クエリを使用できます。

// 不建议的方式:使用Include方法获取所有关联实体
var orders = context.Orders.Include(o => o.Items).ToList();

// 推荐的方式:使用手动链接查询代替Include方法
var orders = context.Orders
    .Join(context.OrderItems,
          o => o.Id,
          oi => oi.OrderId,
          (o, oi) => new { Order = o, OrderItem = oi })
    .ToList();

 

4. NoTracking メソッドを使用します。

NoTracking メソッドを使用して、EF Core の追跡機能を回避します。追跡は、エンティティ オブジェクトを更新および削除する場合に役立ちますが、データの読み取りのみが必要な場合は追加のオーバーヘッドが発生します。NoTracking メソッドを使用して追跡を無効にし、パフォーマンスを向上させます。

// 不建议的方式:使用默认跟踪功能
var order = context.Orders.FirstOrDefault();
// 推荐的方式:使用NoTracking方法
var order = context.Orders.AsNoTracking().FirstOrDefault();

 

5. 生の SQL クエリを実行します。

場合によっては、生の SQL ステートメントを使用する方が EF Core を使用するよりも効率的です。生の SQL クエリは、FromSqlRaw または ExecuteSqlRaw メソッドを使用して実行できます。

// 执行原始SQL查询
var orders = context.Orders.FromSqlRaw("SELECT * FROM Orders WHERE Status = 'Complete'").ToList();

 

6、使用EF.CompileAsyncQuery

EF.CompileAsyncQuery は EF Core の拡張メソッドであり、LINQ 式を非同期クエリにコンパイルできます。LINQ クエリを動的に生成する場合と比較して、EF.CompileAsyncQuery を使用すると、クエリのパフォーマンスが向上し、不要なメモリ割り当てが削減されます。

コンパイルされたクエリは、毎回クエリ式を動的に生成することなく、複数回呼び出すことができます。これにより、不要なメモリ割り当てとクエリ最適化のオーバーヘッドが回避され、クエリのパフォーマンスが向上します。EF Core 5.0 以降では、EF.CompileAsyncQuery が標準の拡張メソッドになり、特別なインストールや構成を行わなくても使用できます。クエリ条件が固定されている状況に適しており、もちろん再コンパイルできますが、頻繁にコンパイルするとメモリとパフォーマンスのオーバーヘッドが発生します。例は次のとおりです。

using Microsoft.EntityFrameworkCore.Query;
// 定义一个异步查询
private static readonly Func<MyDbContext, int, Task<Order>> GetOrderById =
    EF.CompileAsyncQuery((MyDbContext context, int id) =>
        context.Orders.FirstOrDefaultAsync(o => o.Id == id));
// 调用异步查询
var order = await GetOrderById(context, 1);

 

要約する

上記では、パフォーマンス チューニングの 6 つの方法について説明しました。特にインタビュー中に、EF Core のパフォーマンスを改善する方法があるかどうかをインタビュアーから尋ねられたときに、すべての人に役立つことを願っています。それらのいくつかに答えることができます。もちろん、上記の方法が絶対的なものではなく、実際のシナリオに応じて適用する必要があります.たとえば、Includeメソッドはデータ量が少ない場合に適していますが、データ量が多い場合は逆効果です. . 他に EF Core のチューニング方法はありますか。この記事について議論したり、不満を述べたりするメッセージを残してください。

おすすめ

転載: blog.csdn.net/lwf3115841/article/details/130455672