2017-05-09 4 views
1

1つの主キーがあり、そこから大量の行を削除する必要があります(おそらく約200M)。さらに、メインテーブルに関連する約30の「関連」テーブルがあり、関連する行もそれぞれから削除する必要があります。関連するテーブルのそれぞれから等価の膨大な数の行(またはそれ以上)を削除する必要があると予想されます。MS Server上のSQLの複数の関連テーブルから膨大な量のデータを削除する方法

もちろん、条件を変更して削除するデータ量を分割し、それを数回実行することは可能ですが、いずれにしても、これを行うには効率的なソリューションが必要です。

John Reesは、Delete Large Number of Rows Is Very Slow - SQL Server の単一テーブルで大量の削除を行う方法を提案していますが、問題は単一のテーブルで複数のトランザクション削除を実行することです。これにより、DBが矛盾した状態になる可能性があります。

John Gibbは、How do I delete from multiple tables using INNER JOIN in SQL server の複数の関連テーブルから削除する方法を提案していますが、これらの各テーブルから削除するデータ量が大きい可能性は考慮されていません。

これら2つのソリューションを組み合わせて、関連する複数のテーブルから多数の行を効率的に削除する方法を教えてください。 (私はSQLに新たなんだ)

おそらくそれは、この問題の範囲で、各「関連」テーブルのみ、私はこれは何だと思います「メイン」テーブル

+2

は... –

+0

TGE外部キー制約で指定されていません削除して、5000行以下のバッチに固執するか、テーブルをロックする危険があります(marc_sに感謝!)。メインテーブルに移動する前に、それぞれの関連するテーブルから同じ4500行を削除してから、1つのループで同じメインテーブルを削除するようにバッチを作成することもできます。 - 私は数年前に同様のバッチ削除の回答を掲載しました。https://stackoverflow.com/questions/24785439/deleting-1-millions-rows-in-sql-server/24785802#24785802 – JiggsJedi

答えて

1

に関連している、ということに注意することが重要です're after ...

これは、外部キー参照(1:1と仮定)を持つテーブルから4000行を削除してから、同じ4000行をメインテーブルから削除します。

終了するまでループするか、停止時間に達します(有効な場合)。あなたが述べたように有効に削除CASCADE`に、あなたは最良のオプションはバッチ処理されている `持っていない場合、私は削除CASCADE`に`推測している

DECLARE @BATCHSIZE INT, @ITERATION INT, @TOTALROWS INT, @MAXRUNTIME VARCHAR(8), @BSTOPATMAXTIME BIT, @MSG VARCHAR(500) 
SET DEADLOCK_PRIORITY LOW; 
SET @BATCHSIZE = 4000 
SET @MAXRUNTIME = '08:00:00' -- 8AM 
SET @BSTOPATMAXTIME = 1 -- ENFORCE 8AM STOP TIME 
SET @ITERATION = 0 -- LEAVE THIS 
SET @TOTALROWS = 0 -- LEAVE THIS 

IF OBJECT_ID('TEMPDB..#TMPLIST') IS NOT NULL DROP TABLE #TMPLIST 
CREATE TABLE #TMPLIST (ID BIGINT) 

WHILE @BATCHSIZE>0 
BEGIN 
    -- IF @BSTOPATMAXTIME = 1, THEN WE'LL STOP THE WHOLE JOB AT A SET TIME... 
    IF CONVERT(VARCHAR(8),GETDATE(),108) >= @MAXRUNTIME AND @BSTOPATMAXTIME=1 
    BEGIN 
     RETURN 
    END 

    TRUNCATE TABLE #TMPLIST 

    INSERT INTO #TMPLIST (ID) 
    SELECT TOP(@BATCHSIZE) ID 
    FROM MAINTABLE 
    WHERE X=Y -- DELETE CRITERIA HERE... 

    SET @[email protected]@ROWCOUNT 

    DELETE T1 
    FROM SOMETABLE1 T1 
    WHERE EXISTS (SELECT 1 FROM #TMPLIST T WHERE T1.MAINID=T.ID) 

    DELETE T2 
    FROM SOMETABLE2 T2 
    WHERE EXISTS (SELECT 1 FROM #TMPLIST T WHERE T2.MAINID=T.ID) 

    DELETE T3 
    FROM SOMETABLE3 T3 
    WHERE EXISTS (SELECT 1 FROM #TMPLIST T WHERE T3.MAINID=T.ID) 

    DELETE M 
    FROM MAINTABLE M 
    WHERE EXISTS (SELECT 1 FROM #TMPLIST T WHERE T3.MAINID=M.ID) 

    SET @[email protected]+1 
    SET @[email protected][email protected] 
    SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR) 
    RAISERROR (@MSG, 0, 1) WITH NOWAIT 
END 
関連する問題