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