Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menghapus 1 juta baris di SQL Server

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengurai string dan membuat beberapa kolom darinya?

  2. Cara Mengembalikan Daftar Acara Pemicu di SQL Server

  3. Cara Melacak Database yang Dihapus di SQL Server

  4. Menangkap beberapa pesan kesalahan dari satu pernyataan di dalam TRY CATCH

  5. Entity Framework/SQL2008 - Bagaimana cara Memperbarui bidang LastModified secara Otomatis untuk Entitas?