日時列に基づいてSQLServerテーブルの行をアーカイブするプロセスを作成しています。Xより前の日付のすべての行を移動したいのですが、問題は、各日付に数百万の行があるため、各日付に対してBEGIN TRANSACTION ... INSERT ... DELETE...COMMITを実行するのに時間がかかりすぎることです。 、および他のユーザーのためにデータベースをロックします。
小さなチャンクでそれを行う方法はありますか?多分ROWCOUNTまたはそのようなものを使用していますか?
私はもともとこのようなものを考えていました:
SET ROWCOUNT 1000
DECLARE @RowsLeft DATETIME
DECLARE @ArchiveDate DATETIME
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
WHILE @ROWSLEFT IS NOT NULL
BEGIN
INSERT INTO EventsBackups
SELECT top 1000 * FROM Events
DELETE Events
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
END
しかし、その後、削除する行がバックアップしたばかりの行であることを保証できないことに気付きました。または私は...できますか?
更新: 私が検討した別のオプションは、ステップを追加することでした:
- 日付基準を満たす上位1000行を一時テーブルに選択します
- トランザクションを開始します
- 一時テーブルからアーカイブテーブルに挿入します
- ソーステーブルから削除し、すべての列で一時テーブルに結合します
- トランザクションをコミットする
- 日付基準を満たす行がなくなるまで、1〜5を繰り返します。
このシリーズの費用が、以下で説明する他のオプションのいくつかとどのように比較されるかについて、誰かが考えていますか?
詳細:誰かが尋ねたので、私はSQL2005を使用しています。