2008-09-15 6 views
34

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

удалить из client_log

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

ответ

67

Отъезд truncate table, который намного быстрее.

+4

TRUNCATE является самым быстрым, просто помните, что вы не сможете откатить данные в случае, если что-то произойдет. – 2008-09-15 15:50:52

+9

Примечание о TRUNCATE. Если один из столбцов является столбцом IDENTITY, TRUNCATE сбрасывает SEED этого столбца на его начальное значение (указанное при определении таблицы). Поэтому в некотором смысле это похоже на начало новой таблицы. Я считаю это полезным для очистки данных перед повторным заполнением таблиц. – kristof 2008-09-23 16:53:09

+0

Да, и в Oracle World мы называем это смещением водяных знаков, а не уверенными в других. – 2008-12-30 09:55:11

0

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

0

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

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

1

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

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

30

Я обнаружил ТАБЛИЦУ TRUNCATE в ссылке 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 не может использоваться для таблиц, участвующих в индексированном представлении.

1

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

0

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

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

1

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

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

0

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

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

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

От MSDN:

УДАЛИТЬ оператор удаляет строки один в то время, и записывает запись в журнале транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные на , освобождая страницы данных, используемые для , хранящие данные таблицы, и только деблокировки страницы записываются в журнал транзакций .

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

12

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

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

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

0

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

  • падения всех индексов;
  • делать обычные УДАЛИТЬ;
  • воссоздать все индексы.

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

3

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

3

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

CREATE TABLE `new_table` LIKE `table`; 
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`; 
0
DELETE * FROM table_name; 

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

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy; 

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

  • Основная база данных: Oracle, Microsoft, MySQL, PostgreSQL, другие, обычай ...

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

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

DROP TABLE table_name; 

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

Смежные вопросы