Удалить большую часть огромных таблиц - PullRequest
1 голос
/ 23 июня 2010

У меня очень большая таблица (более 300 миллионов записей), которую необходимо очистить.Примерно 80% из этого нужно будет удалить.Программное обеспечение базы данных - MS SQL 2005. В таблице есть несколько индексов и статистика, но нет внешних связей.

Лучшее решение, которое я до сих пор придумал, - это перевести базу данных в «простой» режим восстановления.скопируйте все записи, которые я хочу сохранить, во временную таблицу, обрежьте исходную таблицу, включите идентификационную вставку и скопируйте обратно данные из временной таблицы.

Это работает, но все еще требуется несколько часов для завершения,Есть ли более быстрый способ сделать это?

Ответы [ 3 ]

1 голос
/ 24 июня 2010

Согласно комментариям, я бы предложил просто отказаться от шага копирования и выдвинуть таблицу, содержащую записи, которые должны быть сохранены, чтобы стать новой главной таблицей, переименовав ее.

Это должно быть довольно простосоставить сценарий создания индекса / статистики, который будет применен к новой таблице перед ее заменой.

Кластерный индекс должен быть создан перед некластеризованными индексами.

Пара моментов, в которых я не уверен.

  1. Будет ли быстрее вставить в кучу, а затем создать кластерный индекс впоследствии.(Полагаю, нет, если вставка может быть выполнена в порядке кластерного индекса)
  2. Должна ли исходная таблица быть усечена перед удалением (я полагаю, да)
1 голос
/ 24 июня 2010

@ uriDium - Чанкинг с использованием пакетов по 50 000 будет перерасти в блокировку таблицы, если только вы не отключили эскалацию блокировки через таблицу изменения (sql2k8) или другие различные приемы блокировки.

0 голосов
/ 23 июня 2010

Я не уверен, какова структура ваших данных.Когда строка становится подходящей для удаления?Если это чисто идентификатор, основанный на дате, то вы можете создавать новую таблицу на каждый день, вставлять новые данные в новые таблицы, а когда дело доходит до очистки, просто отбрасывать необходимые таблицы.Затем для любого выбора построить вид на все таблицы.Просто идея.

РЕДАКТИРОВАТЬ: (В ответ на комментарии) Если вы поддерживаете просмотр всех таблиц, то нет, это не будет сложно вообще.Сложная часть заключается в кодировании удаления и повторного создания представления.

Я предполагаю, что вы не хотите, чтобы ваши данные слишком сильно блокировались при удалении.Почему бы не разделить операции удаления.Создал SP, который будет удалять данные порциями по 50 000 строк за раз.Это должно гарантировать, что SQL Server сохраняет блокировку строки вместо блокировки таблицы.Используйте

WAITFOR DELAY 'x'

в вашем цикле while, чтобы вы могли дать другим запросам немного передышки.Ваша проблема - компьютерная наука старости, пространство против времени.

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