【Entity Framework Core】コード修正によるパフォーマンス向上

【Entity Framework Core】コード修正によるパフォーマンス向上

Entity Framework Core のコード修正によるパフォーマンス向上方法について記載します。

AsNoTracking

読み取り専用データの取得は、AsNoTrackingを使用するとパフォーマンス向上する可能性があります。AsNoTrackingで取得したデータは変更トラッキングしないため更新しても反映されません。
// before
var products = context.Products
    .Where(x => x.Price > 1000)
    .ToList();
        
// after
var products = context.Products
    .AsNoTracking()
    .Where(x => x.Price > 1000)
    .ToList();    

Select

Selectを使用して取得するカラムを指定するとパフォーマンス向上する可能性があります。
// before
var products = context.Products
    .Where(x => x.Price > 1000)
    .ToList();
        
// after
var products = context.Products
    .Where(x => x.Price > 1000)
    .Select(x => new { x.Id, x.Name })
    .ToList();

Find

主キーによるデータ取得は、Findを使用するとパフォーマンス向上する可能性があります。
// before
var product = context.Products.Single(x => x.Id == 10000);
        
// after
var product = context.Products.Find(10000);

Include

Includeを使用して関連するエンティティデータを一度に取得するとパフォーマンス向上する可能性があります。
// before
var products = context.Products
    .Where(x => x.Price > 1000)
    .ToList();

foreach (var product in products)
{
    var category = context.Categorys.Find(product.CategoryId);
    product.Category = category;
}
        
// after
var products = context.Products
    .Include(x => x.Category)
    .Where(x => x.Price > 1000)
    .ToList();        

パフォーマンス計測

上記に記載したコード修正前後でどのくらいパフォーマンス向上するか計測しました。

  • 計測環境
  • OS:Windows10(64-bit) RAM:16.0GB CPU:Core i7
    .Net7
    Entity Framework Core Version 7.0.3
    Microsoft SQL Server 2022 Developer Edition (64-bit)

  • 計測データ
  • Productsテーブル :100万件
    Categorysテーブル:100件

    ERModel

  • 計測結果
  • 5回計測した結果の中央値を記載しています。

計測項目 コード修正前(秒) コード修正後(秒) 向上率(%)
AsNoTracking 4.4603 1.3786 69.16
Select 3.2842 1.2997 60.34
Find 0.0017 0.0007 58.82
Include 9.1913 6.7703 26.35

※コード修正による向上率は、データモデルやアクセスするデータ量、利用するデータベースなど、様々な要因で性能は左右されます。そのため必ず上記の結果とはなりません。


Next Post Previous Post