2017-01-24 6 views
1

私は数百万の行を持つ複数のテーブルを持っています。安全で、トランザクションログをオーバーフローさせないために、私は一度に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 
+0

の代わりに参加してみのみ赤色の警告は、サブクエリであるあなたは、それはあなたにいくつかの余分なパフォーマンスを与える必要があります参加するには、それを変更した場合。 –

答えて

2

「WHERE IDが...」私が見るサブクエリ

DELETE TOP (@BatchSize) T1 
OUTPUT DELETED.* INTO dbo.TABLE1_ARCHIVE 
FROM TABLE1 AS T1 
JOIN @FILL_ID_TABLE AS FIL ON FIL.ROLLUP_ID = T1.Id 
+0

JOINで構文エラーが発生しているようです。これは正しいです? – gd000

+0

私はそれをチェックしていない、おそらくタイプミス。あなたはエラーを投稿できますか? –

+0

"JOINの近くに構文が正しくありません" @Esh – gd000

関連する問題