削除を「チャンク化」することは、トランザクション ログ ファイルを肥大化させずに過剰な量のデータを削除するための推奨される方法です。BradC の投稿は、この合理的な例です。
このようなループの管理は、単一のストアド プロシージャ内で行うのが最適です。そのような作業を時間をかけて広めるために、私はまだそれを手順に残しておきます. ループに WAITFOR を挿入すると、同時実行の問題に対処する必要があると思われる場合、削除の各セットの間に「一時停止」が入ります。SQL エージェント ジョブを使用して、プロシージャの開始時期を決定します。特定の時間までに終了する必要がある場合は、それもループに含めます。
このコードに対する私の考えは次のとおりです。
-- NOTE: This is a code sample, I have not tested it
CREATE PROCEDURE ArchiveData
@StopBy DateTime
-- Pass in a cutoff time. If it runs this long, the procedure will stop.
AS
DECLARE @LastBatch int
SET @LastBatch = 1
-- Initialized to make sure the loop runs at least once
WHILE @LastBatch > 0
BEGIN
WAITFOR DELAY '00:00:02'
-- Set this to your desired delay factor
DELETE top 1000 -- Or however many per pass are desired
from SourceTable
-- Be sure to add a where clause if you don't want to delete everything!
SET @LastBatch = @@rowcount
IF getdate() > @StopBy
SET @LastBatch = 0
END
RETURN 0
うーん。投稿を読み直すということは、データを削除する前に、まずデータをどこかにコピーすることを意味します。それを行うには、一時テーブルを設定し、ループ内で最初に一時テーブルを切り捨て、次に TOP N 項目の主キーをコピーし、一時テーブルへの結合を介して「アーカイブ」テーブルに挿入します。次に、一時テーブルへの結合を介してソース テーブルも削除します。(単純な削除よりも少し複雑ですよね?)