«Упорядочивание» удаляемых файлов - это предпочтительный способ удаления избыточных объемов данных без раздувания файлов журнала транзакций. Пост BradC является разумным примером этого.
Управление такими циклами лучше всего выполнять в рамках одной хранимой процедуры. Чтобы распространить такую работу во времени, я бы все равно оставил ее в процедуре. Вставка WAITFOR в цикл поставит «паузу» между каждым набором удалений, если вы считаете, что это необходимо для решения возможных проблем параллелизма. Используйте задание агента SQL, чтобы определить, когда процедура запускается - и если вам нужно убедиться, что она останавливается к определенному времени, включите это в цикл.
Мой код этого кода будет:
-- NOTE: This is a code sample, I have not tested it
CREATE PROCEDURE ArchiveData
@StopBy DateTime
-- Pass in a cutoff time. If it runs this long, the procedure will stop.
AS
DECLARE @LastBatch int
SET @LastBatch = 1
-- Initialized to make sure the loop runs at least once
WHILE @LastBatch > 0
BEGIN
WAITFOR DELAY '00:00:02'
-- Set this to your desired delay factor
DELETE top 1000 -- Or however many per pass are desired
from SourceTable
-- Be sure to add a where clause if you don't want to delete everything!
SET @LastBatch = @@rowcount
IF getdate() > @StopBy
SET @LastBatch = 0
END
RETURN 0
Хм. Перечитывание вашей публикации подразумевает, что вы хотите сначала скопировать данные куда-нибудь, прежде чем удалять их. Для этого я бы настроил временную таблицу, и внутри цикла сначала обрежу временную таблицу, затем скопирую первичные ключи элементов TOP N, вставлю в «архивную» таблицу через соединение с временной таблицей, затем удалите исходную таблицу также через соединение с временной таблицей. (Просто немного сложнее, чем прямое удаление, не так ли?)