【Entity Framework Core】レコード削除と性能比較
Entity Framework Core によるレコード削除方法と性能比較結果を記載します。
Remove
Removeメソッドに単一エンティティを設定して、SaveChangeメソッドを実行することでレコードを削除します。
using (var context = new Context())
{
foreach (var product in context.Products.Where(p => p.Price > 1000).ToList())
{
context.Products.Remove(product);
}
context.SaveChanges();
}
RemoveRange
RemoveRangeメソッドに複数エンティティを設定して、SaveChangeメソッドを実行することでレコードを削除します。
using (var context = new Context())
{
var products = context.Products.Where(p => p.Price > 1000).ToList();
context.Products.RemoveRange(products);
context.SaveChanges();
}
Attach
Attachメソッドで単一エンティティをアタッチして削除状態にしたあと、SaveChangeメソッドを実行することでレコードを削除します。
using (var context = new Context())
{
foreach (var product in context.Products.Where(p => p.Price > 1000).ToList())
{
context.Products.Attach(product);
context.Entry(product).State = EntityState.Deleted;
}
context.SaveChanges();
}
AttachRange
AttachRangeメソッドで複数エンティティをアタッチして削除状態にしたあと、SaveChangeメソッドを実行することでレコードを削除します。
using (var context = new Context())
{
var products = context.Products.Where(p => p.Price > 1000).ToList();
context.Products.AttachRange(products);
foreach (var product in products)
{
context.Entry(product).State = EntityState.Deleted;
}
context.SaveChanges();
}
ExecuteDelete
ExecuteDeleteメソッドを実行してレコードを削除します。SaveChangeメソッドは不要です。
※ExecuteDeleteメソッドはEFCore7.0から使用可能です。
※ExecuteDeleteメソッドはEFCore7.0から使用可能です。
using (var context = new Context())
{
var count = context.Products.Where(p => p.Price > 1000).ExecuteDelete();
}
性能比較
レコード削除方法ごとに性能測定した結果を記載します。
- 計測環境
- 処理内容
- 計測結果
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)
100万件のレコードを削除します。
5回計測した結果の中央値を記載しています。
計測メソッド | 処理時間(秒) |
---|---|
Remove | 41.388 |
RemoveRange | 41.122 |
Attach | 39.718 |
AttachRange | 39.882 |
ExecuteDelete | 04.530 |
ExecuteDeleteが他のメソッドより圧倒的に早い結果となりました。
RemoveよりもAttachのほうが若干早い結果となりました。RemoveRangeとAttachRangeも同様の結果です。
単一エンティティを指定した削除と複数エンティティを設定した削除では性能差は見られませんでした。
(RemoveとRemoveRange および AttachとAttachRangeで性能差なし)
(RemoveとRemoveRange および AttachとAttachRangeで性能差なし)