Удаление 30-40 миллионов записей без ущерба для производительности - PullRequest
3 голосов
/ 02 июня 2011

У меня база данных SQL Server работает в режиме полного восстановления.Мне нужно удалить данные (около 30-40 миллионов записей), но я не могу перевести базу данных в автономный режим, поскольку она постоянно используется.Я также не могу переключить его в режим простого восстановления, если что-то случится, и мы потеряем живые данные.Когда я пытаюсь удалить данные небольшими порциями (около 2 миллионов строк), журнал транзакций становится очень большим и приводит к очень медленному процессу.В связи с тем, что резервные задания выполняются ночью, у меня только небольшой таймфрейм.

У кого-нибудь есть мысли о том, как я могу это сделать?Я думал о копировании таблицы в другую базу данных (в режиме простого восстановления), а затем удалить данные.Это хорошая идея?

Есть 3 таблицы под вопросом.Кампания, События и Цели.Это таблица Events, в которой находятся миллионы записей, и это то, что требует времени для удаления.Все они имеют необходимые отношения через столбцы Id.

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

У вас есть для использования маленьких кусков, иначе ваш журнал транзакций увеличится

Будет зарегистрировано каждое из 30-40 миллионов удалений. Если вы создадите новую таблицу и скопируете «сохранить» строки, у вас останется более 50 миллионов зарегистрированных строк. Факт простого и полного восстановления не имеет значения: каждое удаление / вставка регистрируется

Если при простом восстановлении журнал увеличивается, то я подозреваю, что вы делаете это в транзакции. Таким образом, 30-40 миллионов удалений все еще регистрируются, даже в простом восстановлении, потому что, возможно, все это нужно будет откатить.

Для 40 x 1 миллиона удалений без транзакции в более простом восстановлении вы можете использовать CHECKPOINT , чтобы помочь в регистрации журнала

См. Массовое УДАЛЕНИЕ в SQL Server 2008 (Есть ли что-то вроде Массовое копирование (bcp) для удаления данных?) для более

Но что-то вроде:

SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
BEGIN
    CHECKPOINT
    --Edit: must be last to set @@ROWCOUNT
    DELETE TOP (1000000) MyTable WHERE ...
END

Процесс:

  • полная резервная копия
  • изменить восстановление на простое
  • удалить
  • изменить восстановление на полное (или как было раньше)
  • полное резервное копирование

У вас не так много других вариантов, если вы настаиваете на удалении более 30 миллионов строк за один раз в короткие окна ...

1 голос
/ 02 июня 2011

Какие критерии вы используете, чтобы выбрать 30-40 миллионов строк для удаления? Если это что-то довольно простое (например, «старше 10 дней»), вы можете использовать механизм разбиения таблиц в SQL Server. Существуют некоторые хорошо документированные методы (см. Ссылку ниже) по переключению разделов для работы с вариантами использования, аналогичными вашим.

pjjH

http://msdn.microsoft.com/en-us/library/ms191160%28v=sql.100%29.aspx

...