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

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

удалить из client_log

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

Ответы [ 15 ]

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

Проверить урезать таблицу , что намного быстрее.

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

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

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

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

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

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

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

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

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

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

Этот миф используется в нескольких комментариях здесь. Давайте уничтожим это вместе;)

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

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

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

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

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
3 голосов
/ 15 сентября 2008

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

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

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

Если вы не хотите потерять свои автоинкрементные ключи, вы можете ускорить удаление, удалив наборы (например, УДАЛИТЬ ИЗ таблицы, ГДЕ id> 1 И id <10000). Это значительно ускорит его и в некоторых случаях предотвратит блокировку данных. </p>

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

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

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

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

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

0 голосов
/ 20 сентября 2008
DELETE * FROM table_name;

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

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

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

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

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

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

DROP TABLE table_name;

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

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