0

この列を含むテーブルがあります(特に):

id int identity(1,1) not null

レコードが挿入されたおおよその日付を格納する列を追加しました。

insertdate smalldatetime null

insertdate関連するテーブルとログのフォレンジック検索で見つかった最も古い参照を使用して、可能な場所を記入しました。ただし、これにより、データ内に多数の NULL の「ギャップ」が残り、ID 番号が小さいレコードがinsertdate後続の ID 値よりも新しい値を持つ状況が発生します。

identity属性は、より高い値を持つレコードよりも前にレコードが作成されたに違いないと仮定するための適切な根拠を提供するため、それが null であるか、後続の ID が以前の日付を持つすべてのレコードに対してIDを更新することにしました。insertdate

UPDATE
table
SET
insertdate = (SELECT MIN(insertdate) 
      FROM table t2
      WHERE
        t2.id >= table.id 
        AND t2.insertdate IS NOT NULL
      )

残念ながら、このような更新はサーバーの昼食を食べています... 1 時間で 250 万レコードを数えます。

これをより効率的に行う方法についてのアイデアはありますか?

一度だけ実行する必要がありますが、これは運用サーバーであるため、テーブルを必要以上にロックアップしないことをお勧めします。

4

1 に答える 1

2

これが役立つかどうかはわかりませんが、null をテストする必要はありません。
Min() は null を考慮しません。

UPDATE
table 
SET
insertdate = (SELECT MIN(t2.insertdate) 
                FROM table t2
               WHERE t2.id >= table.id 
                 AND t2.ID < table.id + 10000)  

次の x 行に限定していただけますか?
より短い日付を見つけることができないと確信しているポイントはありますか?

また、日付のデフォルトを設定すると、テーブルと t2 を最初の行の ID に制限できます。

トランザクション ログがいっぱいになり、すべてがロールバックされる可能性があります。
それが発生した場合は、辛抱強く元に戻してください。
ここで中止すると、ロールバックする必要があります。
100,000 のバッチに分割すると、トランザクション ログが消去されます。

于 2012-10-08T20:24:57.483 に答える