Подтвердить что ты не робот

Самый быстрый способ удалить все данные в большой таблице

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

удалить из client_log

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

4b9b3361

Ответ 2

Я обнаружил TRUNCATE TABLE в ссылке msdn transact-SQL. Для всех заинтересованных здесь есть замечания:

TRUNCATE TABLE функционально идентичен оператору DELETE без предложения WHERE: оба удаляют все строки в таблице. Но TRUNCATE TABLE быстрее и использует меньше ресурсов системных и транзакционных журналов, чем DELETE.

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

TRUNCATE TABLE удаляет все строки из таблицы, но структура таблицы и ее столбцы, ограничения, индексы и т.д. остаются. Счетчик, используемый идентификатором для новых строк, равен reset семени для столбца. Если вы хотите сохранить счетчик идентификаторов, вместо этого используйте DELETE. Если вы хотите удалить определение таблицы и ее данные, используйте оператор DROP TABLE.

Вы не можете использовать TRUNCATE TABLE в таблице, на которую ссылается ограничение FOREIGN KEY; вместо этого используйте инструкцию DELETE без предложения WHERE. Поскольку TRUNCATE TABLE не регистрируется, он не может активировать триггер.

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

Ответ 3

Существует общий миф о том, что TRUNCATE как-то пропускает журнал транзакций.

Это недоразумение и четко упоминается в MSDN.

Этот миф вызывается в нескольких комментариях здесь. Позвольте искоренить его вместе;)

Ответ 4

Для справки TRUNCATE TABLE также работает с MySQL

Ответ 5

забыть усечь и удалить. сохраняйте свои определения таблиц (в случае, если вы хотите их воссоздать) и просто используйте таблицу drop.

Ответ 6

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

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;

Ответ 7

В SQL Server вы можете использовать команду Truncate Table, которая быстрее обычного удаления, а также использует меньше ресурсов. Он будет reset любыми полями идентификаторов обратно к начальному значению.

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

Ответ 8

truncate table не независимая SQL-платформа. Если вы подозреваете, что вы могли когда-либо менять поставщиков баз данных, вы можете опасаться его использования.

Ответ 9

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

Если вы не хотите потерять свои автоматически увеличивающиеся ключи, вы можете ускорить удаление, удалив в наборах (например, DELETE FROM table WHERE id > 1 AND id < 10000). Это значительно ускорит его и в некоторых случаях предотвратит блокировку данных.

Ответ 10

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

Ответ 11

обрезать таблицу client_log

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

Ответ 12

Предложение "Drop and rereate the table", вероятно, не очень хорошее, потому что это приводит к посторонним ключам.

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

Ответ 13

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

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

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

От MSDN:

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

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

Ответ 14

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

  • удалить все индексы;
  • выполните обычный DELETE;
  • заново создайте все индексы.

Это может ускорить DELETE несколько.

Ответ 15

DELETE * FROM table_name;

Преждевременная оптимизация может быть опасной. Оптимизация может означать, что вы делаете что-то странное, но если это сработает, вы можете воспользоваться им.

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

Для скорости я думаю, что это зависит от...

  • Базовая база данных: Oracle, Microsoft, MySQL, PostgreSQL, другие, пользовательские...

  • Таблица, содержимое и связанные таблицы:

Могут быть правила удаления. Существует ли существующая процедура удаления всего содержимого в таблице? Может ли это быть оптимизировано для конкретного базового движка базы данных? Сколько мы заботимся о том, чтобы разбить вещи/связанные данные? Выполнение DELETE может быть "самым безопасным", предполагая, что другие связанные таблицы не зависят от этой таблицы. Существуют ли другие таблицы и запросы, которые связаны/зависят от данных в этой таблице? Если нам не очень нравится эта таблица, использование DROP может быть быстрым методом, опять же в зависимости от базовой базы данных.

DROP TABLE table_name;

Сколько строк удаляется? Есть ли другая информация, которая быстро подбирается, чтобы оптимизировать удаление? Например, можем ли мы сказать, что таблица уже пуста? Можем ли мы сказать, есть ли сотни, тысячи, миллионы, миллиарды строк?