Масса SQL удаляет - PullRequest
       17

Масса SQL удаляет

4 голосов
/ 07 октября 2009

Я пытаюсь сжать некоторые базы данных, чтобы мои разработчики могли загрузить их на свои локальные машины. Я выделил несколько таблиц, в которых хранятся исторические данные (на 10+ лет), которые значительно уменьшат общий размер базы данных (на 50% и более), если я удалю записи старше X дней.

Оператор удаления, который я использую, показан ниже, но мой вопрос: как я могу улучшить скорость этого оператора удаления? Базы данных уже находятся в простом формате журналирования, но журналы по-прежнему растут с оператором удаления. Есть ли лучший способ регистрации?

Буду ли я лучше сделать это:

  1. Копирование данных, которые я хочу сохранить из текущей таблицы во временную таблицу,
  2. Усеченная первичная таблица,
  3. Переместить данные из временного режима в основной,
  4. термоусадочный журнал,
  5. Сжатие базы данных, когда сделано со всеми таблицами, которые необходимо сжать.

Пример запроса:

DELETE FROM LoginAttempts WHERE DateAttempt <= GETDATE() - 30

Ответы [ 4 ]

2 голосов
/ 07 октября 2009

TRUNCATE и CREATE AS SELECT намного быстрее, чем удаление таблицы целом , так как они генерируют меньше повторных записей.

Однако они являются DDL командами и не могут быть отменены в некоторых системах.

Однако DELETE может быть еще быстрее, если есть несколько строк для удаления.

Если будет удалена половина строк, то, скорее всего, первый вариант будет быстрее, по крайней мере, в Oracle.

1 голос
/ 07 октября 2009

Ваш вариант удаления данных, которые вы хотите сохранить, очень действителен, но работает, только если сохраняемая сумма мала по сравнению с удаляемыми данными.

Для более эффективного удаления вы можете захотеть выполнить пакетную операцию удаления, которая удаляет только первые 1000 строк (не используйте предложение order!), Чтобы размер каждой транзакции удаления оставался небольшим и не удерживал блокировки / использовать много темп и т. д.

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

0 голосов
/ 08 октября 2009

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

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

0 голосов
/ 07 октября 2009

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

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

У меня были проблемы с максимизацией дискового пространства в журналах транзакций, поэтому я иногда использовал циклы while, которые просто продолжают удалять N строк одновременно.

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

...