Berikut adalah struktur untuk penghapusan batch seperti yang disarankan di atas. Jangan coba 1 juta sekaligus...
Ukuran batch dan penundaan tunggu jelas cukup bervariasi, dan akan tergantung pada kemampuan server Anda, serta kebutuhan Anda untuk mengurangi pertengkaran. Anda mungkin perlu menghapus beberapa baris secara manual, mengukur berapa lama waktu yang dibutuhkan, dan menyesuaikan ukuran batch Anda dengan sesuatu yang dapat ditangani oleh server Anda. Seperti disebutkan di atas, apa pun yang lebih dari 5000 dapat menyebabkan penguncian (yang tidak saya sadari).
Ini akan lebih baik dilakukan setelah jam ... tetapi 1 juta baris benar-benar tidak banyak untuk ditangani oleh SQL. Jika Anda melihat pesan Anda di SSMS, mungkin perlu beberapa saat untuk menampilkan hasil cetak, tetapi setelah beberapa batch, perlu diketahui bahwa itu tidak akan diperbarui secara real-time.
Sunting:Menambahkan waktu berhenti @MAXRUNTIME
&@BSTOPATMAXTIME
. Jika Anda mengatur @BSTOPATMAXTIME
ke 1, skrip akan berhenti sendiri pada waktu yang diinginkan, katakanlah 8:00 pagi. Dengan cara ini Anda dapat menjadwalkannya setiap malam untuk mulai katakanlah tengah malam, dan itu akan berhenti sebelum produksi pada pukul 8 pagi.
Sunting:Jawabannya cukup populer, jadi saya telah menambahkan RAISERROR
sebagai pengganti PRINT
per komentar.
DECLARE @BATCHSIZE INT, @WAITFORVAL VARCHAR(8), @ITERATION INT, @TOTALROWS INT, @MAXRUNTIME VARCHAR(8), @BSTOPATMAXTIME BIT, @MSG VARCHAR(500)
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @WAITFORVAL = '00:00:10'
SET @MAXRUNTIME = '08:00:00' -- 8AM
SET @BSTOPATMAXTIME = 1 -- ENFORCE 8AM STOP TIME
SET @ITERATION = 0 -- LEAVE THIS
SET @TOTALROWS = 0 -- LEAVE THIS
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
DELETE TOP(@BATCHSIZE)
FROM SOMETABLE
WHERE 1=2
SET @[email protected]@ROWCOUNT
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
WAITFOR DELAY @WAITFORVAL
END