Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изтриване на 1 милион реда в SQL Server

Ето структура за групово изтриване, както е предложено по-горе. Не опитвайте 1M наведнъж...

Размерът на пакета и забавянето на чакане очевидно са доста променливи и ще зависят от възможностите на сървърите ви, както и от необходимостта ви да смекчите конкуренцията. Може да се наложи ръчно да изтриете някои редове, измервайки колко време отнемат, и да коригирате размера на партидата си към нещо, с което вашият сървър може да се справи. Както споменахме по-горе, всичко над 5000 може да причини заключване (за което не знаех).

Това би било най-добре да се направи след часове... но 1M редове наистина не са много за обработка на SQL. Ако гледате съобщенията си в SSMS, може да отнеме известно време, преди изходът за печат да се покаже, но това ще стане след няколко партиди, само имайте предвид, че няма да се актуализира в реално време.

Редактиране:Добавено е време за спиране @MAXRUNTIME &@BSTOPATMAXTIME . Ако зададете @BSTOPATMAXTIME до 1, скриптът ще спре сам в желаното време, да речем 8:00 сутринта. По този начин можете да планирате всяка вечер да започне да кажем в полунощ и ще спре преди производството в 8 сутринта.

Редактиране:Отговорът е доста популярен, затова добавих RAISERROR вместо PRINT на коментари.

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. Вземете ROWS като КОЛОНИ (динамична PIVOT заявка на SQL Server)

  2. Разпределена транзакция на свързан сървър между sql сървър и mysql

  3. Време за изчакване на връзката за SQL сървър

  4. ODBC и SQL Server 2008:Не можете да използвате подготвени изрази?

  5. TSQL Опитайте/Уловете в рамките на транзакция или обратно?