Я пишу процесс, который архивирует строки из таблицы SQL Server на основе столбца datetime. Я хочу переместить все строки с датой до X, но проблема в том, что для каждой даты есть миллионы строк, поэтому выполните BEGIN TRANSACTION ... INSERT ... DELETE ... COMMIT для каждой даты занимает слишком много времени , и блокирует базу данных для других пользователей.Переместить данные SQL Server в узлах (1000 строк)
Есть ли способ, которым я могу это сделать в небольших кусках? Может быть, использовать ROWCOUNT или что-то в этом роде?
я первоначально считалось чем-то вроде этого:
SET ROWCOUNT 1000
DECLARE @RowsLeft DATETIME
DECLARE @ArchiveDate DATETIME
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
WHILE @ROWSLEFT IS NOT NULL
BEGIN
INSERT INTO EventsBackups
SELECT top 1000 * FROM Events
DELETE Events
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
END
Но потом я понял, что я не могу гарантировать, что строки я удаляю, те, которые я только что скопированными. Или я могу ...?
UPDATE: Еще вариант я Рассмотренная добавляли шаг:
- Выбор TOP 1000 строк, которые соответствуют моим критериям даты в временной таблицу
- начать транзакцию
- Вставки из температуры таблица в архивную таблицу
- Удалить из исходной таблицы, соединяясь с временной таблицей в каждом столбце
- Commit transa фикция
- Повторить 1-5, пока строки не остаются, которые отвечают критериям даты
Кто-нибудь есть идея, как счет этой серии можно сравнить с некоторыми из других вариантов, обсуждаемых ниже?
ДЕТАЛИ: Я использую SQL 2005, так как кто-то спросил.
Выводы OUTPUT и INTO - ваш друг, посмотрите их или посмотрите мой ответ ... –