【Entity Framework Core】レコード削除と性能比較

【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から使用可能です。

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で性能差なし)


Next Post Previous Post