Самый быстрый способ удалить все данные в большой таблице - PullRequest
44 голосов
/ 15 сентября 2008

Мне пришлось удалить все строки из таблицы журнала, которая содержала около 5 миллионов строк. Первоначально я попытался выполнить следующую команду в анализаторе запросов:

удалить из client_log

, что заняло очень много времени.

Ответы [ 15 ]

0 голосов
/ 15 сентября 2008

Если вы не можете использовать TRUNCATE TABLE из-за внешних ключей и / или триггеров, вы можете рассмотреть следующие вопросы:

  • сбросить все индексы;
  • сделать обычное УДАЛЕНИЕ;
  • пересоздать все индексы.

Это может несколько ускорить УДАЛЕНИЕ.

0 голосов
/ 15 сентября 2008

Я пересматриваю свое предыдущее утверждение:

Вы должны понимать это, используя TRUNCATE данные будут очищены, но ничего не будет записано в Журнал транзакций. Запись в журнал вот почему DELETE будет длиться вечно на 5 миллион строк Я часто использую TRUNCATE во время разработки, но вы должны быть с осторожностью использовать его на производстве база данных, потому что вы не сможете откатить ваши изменения. Вам следует немедленно сделать полную базу данных резервное копирование после выполнения TRUNCATE для создать новую основу для восстановления.

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

С MSDN :

Оператор DELETE удаляет строки один в то время и записывает запись в журнал транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные освобождение страниц данных, используемых для хранить данные таблицы, и только освобождение страницы записывается в журнал транзакций.

Я просто хотел сказать, что между этими двумя понятиями есть принципиальная разница, и, поскольку есть разница, будут приложения, в которых одно или другое может быть неуместным.

0 голосов
/ 15 сентября 2008

Предложение "Бросить и воссоздать таблицу", вероятно, не очень хорошее, потому что это лишает вас внешних ключей.

Вы используете внешние ключи, верно?

0 голосов
/ 15 сентября 2008

таблица усечений client_log

- ваша лучшая ставка, усечение убивает все содержимое таблицы и индексов и сбрасывает все семена, которые у вас есть.

0 голосов
/ 15 сентября 2008

Да, ну, удаление 5 миллионов строк, вероятно, займет много времени. Единственный потенциально более быстрый способ, который я могу придумать, - это сбросить стол и воссоздать его. Конечно, это работает, только если вы хотите удалить ВСЕ данные в таблице.

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