私は数百万の行を持つ複数のテーブルを持っています。安全で、トランザクションログをオーバーフローさせないために、私は一度に100,000行のバッチでそれらを削除しています。私はまず、日付に基づいてフィルタを外し、特定の日付よりも短いすべての行を削除する必要があります。私は、そのテーブルに挿入し、ループを使用して、目的のテーブルから行を削除バッチ削除は正しくフォーマットされていますか?
:私は削除する必要がある行のIDを保持している私のストアドプロシージャでテーブルを作成しています。これを行うために
。これは正常に実行されたようですが、非常に遅いです。これは正しく行われていますか?これはこれを行う最速の方法ですか?
DECLARE @FILL_ID_TABLE TABLE (
FILL_ID varchar(16)
)
DECLARE @TODAYS_DATE date
SELECT
@TODAYS_DATE = GETDATE()
--This deletes all data older than 2 weeks ago from today
DECLARE @_DATE date
SET @_DATE = DATEADD(WEEK, -2, @TODAYS_DATE)
DECLARE @BatchSize int
SELECT
@BatchSize = 100000
BEGIN TRAN FUTURE_TRAN
BEGIN TRY
INSERT INTO @FILL_ID_TABLE
SELECT DISTINCT
ID
FROM dbo.ID_TABLE
WHERE CREATED < @_DATE
SELECT
@BatchSize = 100000
WHILE @BatchSize <> 0
BEGIN
DELETE TOP (@BatchSize) FROM TABLE1
OUTPUT DELETED.* INTO dbo.TABLE1_ARCHIVE
WHERE ID IN (SELECT
ROLLUP_ID
FROM @FILL_ID_TABLE)
SET @BatchSize = @@rowcount
END
SELECT
@BatchSize = 100000
WHILE @BatchSize <> 0
BEGIN
DELETE TOP (@BatchSize) FROM TABLE2
OUTPUT DELETED.* INTO dbo.TABLE2_ARCHIVE
WHERE ID IN (SELECT
FILL_ID
FROM @FILL_ID_TABLE)
SET @BatchSize = @@rowcount
END
PRINT 'Succeed'
COMMIT TRANSACTION FUTURE_TRAN
END TRY
BEGIN CATCH
PRINT 'Failed'
ROLLBACK TRANSACTION FUTURE_TRAN
END CATCH
の代わりに参加してみのみ赤色の警告は、サブクエリであるあなたは、それはあなたにいくつかの余分なパフォーマンスを与える必要があります参加するには、それを変更した場合。 –