копирование данных из огромной производственной таблицы - PullRequest
5 голосов
/ 14 февраля 2012

Компания, в которой я работаю, имеет несколько огромных журнальных / журнальных таблиц, которые записываются каждые 10 секунд или около того с помощью транзакций.Я хотел бы скопировать много данных из этой таблицы и удалить их из этой таблицы, потому что около 75% старых данных могут быть помещены в архивную таблицу или что-то в этом роде, но если я сделаю это неправильно, и таблица будет заблокированавверх это будет катастрофа.

В предыдущем вопросе парень придумал что-то вроде этого, я хотел бы знать, что это не все испортило бы, достаточно ли намека на nolock, чтобы держать меня в безопасностии все записи работают нормально?Если нет, что мне делать?

set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = max(id)+1
from newtable

select @LastID = max(ID)
from oldtable

while @StartID < @LastID
begin
set @EndID = @StartID + 1000000

insert into newtable (FIELDS,GO,HERE)
select FIELDS,GO,HERE from oldtable (NOLOCK)
where id BETWEEN @StartID AND @EndId

set @StartID = @EndID + 1
end
set identity_insert newtable off
go

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Предостережение при создании списка, вероятно, слишком велико, но вы захотите запустить пакетное удаление.

Для INSERT вам, вероятно, не нужен цикл WHILE. Для DELETE, однако, я бы использовал что-то вроде этого (настроить размер партии в соответствии с вашими потребностями):

WHILE 1=1
BEGIN
   DELETE TOP (10000) o
   FROM OldTable o
   INNER JOIN NewTable N
      ON o.id = n.id
   IF @@ROWCOUNT < 10000 BREAK;
END

Это будет DELETE 10 тыс. Записей одновременно, если есть записи для удаления.

0 голосов
/ 14 февраля 2012

Один из вариантов - разделить таблицу по часам (при условии, что в таблице есть столбец DATETIME, который по умолчанию равен GETDATE() при каждой вставке). Наличие разделов позволяет выполнять обслуживание (удаление, копирование и т. Д.) Старых разделов, не затрагивая текущий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...