1

古いレコードを消去したい大きなテーブルがあります。レコードには「FilePath」フィールドがあります。ここでの「クリア」とは、「FilePath」を null としてマークすることを意味します。問題は、テーブルに何百万ものレコードがあるため、一度更新することは不可能です。それは記憶を吹き飛ばします。したがって、私の戦略は、毎回 2000 行を取得して更新し、次のブロックで作業を続けることです。

私のクエリ:

int pageNumber = 0;
int pageSize = 2000;
bool hasHitEnd = false;

while (!hasHitEnd)
{
var size = pageNumber * pageSize;
var query = cdrContext.Mytable.Where(c => c.FacilityID == facilityID && c.FilePath != null && c.TimeStationOffHook < oldDate)
    .OrderBy(c => c.TimeStationOffHook)
    .Skip(size)
    .Take(pageSize)
    .Select(c => new { c.FilePath, c.FileName })
    .ToList();
      var q = cdrContext.Mytable.Where(c => c.FacilityID == facilityID && c.FilePath != null && c.TimeStationOffHook < oldDate)
         .OrderBy(c => c.TimeStationOffHook)
         .Skip(size)
         .Take(pageSize)
         .ToList();
foreach (var y in q)
{
   y.FilePath = null;
}
cdrContext.SaveChanges();
if (query.Count() < pageSize)
{
    hasHitEnd = true;
}
pageNumber++;

コードに自信がありません。データを更新した後、FilePath が null になるためです。その後、次の実行では、1 つのブロックをスキップするため、正しいブロックを指していない可能性があります。

スキップ部分を削除する必要がありますか?

4

2 に答える 2

1

レコードをスキップする必要はありません。次のページが最初のページになります。また、db を 2 回クエリする必要はありません。query と q を使用していることがわかりますが、これは必要ありません。q を使用するだけで、パフォーマンスが大幅に向上します。次のコードを削除できます

 if (query.Count() < pageSize)
 {
     hasHitEnd = true;
 }

q.Count() == 0 の場合、それを q のレコード数に置き換えます。ループを中断するか、hasHitEnd = true; を設定できます。

于 2013-08-02T13:15:43.743 に答える