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