2013-05-08 9 views
13

〜60,000行を含むデータベーステーブル(SQL Server 2012 Expressで実行中)があります。私は古い行削除するには、次のコードを使用しています多数のレコードを削除するのに非常に時間がかかります

:(テーブル内のレコードの90%以上が削除されている〜)削除された行の数が多い場合

//Deleting CPU measurements older than (oldestAllowedTime) 
var allCpuMeasurementsQuery = from curr in msdc.CpuMeasurements where 
    curr.Timestamp < oldestAllowedTime select curr; 
foreach (var cpuMeasurement in allCpuMeasurementsQuery) 
{ 
    msdc.CpuMeasurements.Remove(cpuMeasurement); 
} 

は、操作が非常に取り長いです。比較的強力なマシン(Intel I5デスクトップ)でこの操作を完了するのに約30分かかります。

  1. これは正常な動作のようですか?

  2. 私は操作の時間を短縮するために何ができるのですか?

おかげで、

+3

DeleteAllOnSubmitをご覧ください。 – DavidB

+2

AFAIKはあなたがやっていることは、データベースを削除するコマンドを60,000回以上実行しています。代わりに1つのコマンドまたは数百コマンド以下のバッチを実行することができれば、そのパフォーマンスの問題は発生しません。 – Renan

+4

エンティティフレームワークはそのようなことではあまり良くありません。タイムスタンプで渡すストアドプロシージャを作成するのが最善であり、そのようにすべてのレコードを削除します。 – Belogix

答えて

17

エンティティフレームワークは、このような一括操作を処理するにはあまりよくありません。このような状況では、データソースに対してSQLを直接実行するには、ExecuteStoreCommandを使用する必要があります。

これにより、エンティティをメモリにロードして(削除するだけで)、データベースに何千もの削除コマンドを発行する必要がなくなります。

+0

+1これは私もそれを解決した方法でした –

+2

私はここにすべての提案を感謝します。私は今のところこのソリューションを選択していますが、少なくとも私にとっては最も簡単です。私は、ここに述べた他の解決策が有望であるように思える(EntityFramework.Extended)と、物事が落ち着くときにそれらをチェックする。 – OSH

13

あなたはそれがバルク削除と更新の両方を支援するために作成されたEntityFramework.Extendedをご覧ください。

それを使用して、単純に行うことができます:

msdc.CpuMeasurements.Delete(curr => curr.Timestamp < oldestAllowedTime); 
-1

は長い時間がかかることが大量のデータを削除します。

アプリケーションからsqlを移動し、SQL Server Agentを使用して1つのsqlスクリプトとして実行する必要があります。たとえば、最も静かな時間に1日に1回実行することができます。

5

この理由は、1レコードごとにDB更新を実行するためです。一括更新が必要です。

EntityFramework.extendedはこのシナリオを処理できます。

関連する問題