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

Реализация концепции с наивысшей оценкой выше, которая возвращает ее в список:

def SetOfListInOrder(incominglist):
    from collections import OrderedDict
    outtemp = OrderedDict()
    for item in incominglist:
        outtemp[item] = None
    return(list(outtemp))

Протестировано (кратко) на Python 3.6 и Python 2.7.

45
задан Joel Coehoorn 23 October 2008 в 16:36
поделиться

15 ответов

Выезд усеченная таблица , которая намного быстрее.

78
ответ дан elyashiv 8 November 2019 в 00:41
поделиться
DELETE * FROM table_name;

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

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

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

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

  • таблица, это довольно, и связанные таблицы:

могут быть правила удаления. Существует ли существующая процедура для удаления всего содержания в таблице? Это может быть оптимизировано для определенного базового механизма базы данных? О каком количестве мы заботимся о повреждающихся вещах / связанные данные? Выполнение УДАЛЕНИЯ может быть 'самым безопасным' способом предположить, что другие связанные таблицы не зависят от этой таблицы. Есть ли другие таблицы и запросы, которые связаны / зависят от данных в этой таблице? Если мы не заботимся очень об этой таблице, являющейся вокруг, использование ОТБРАСЫВАНИЯ могло бы быть быстрым методом, снова в зависимости от базовой базы данных.

DROP TABLE table_name;

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

-1
ответ дан Mark Stock 8 November 2019 в 00:41
поделиться

Я пересматриваю свой более ранний оператор:

необходимо понять, что при помощи УСЕЧЕННОГО данные будут очищены, но ничто не будет зарегистрировано к журналу транзакций. Запись в журнал состоит в том, почему УДАЛЯЮТ, возьмет навсегда на 5 миллионах строк. Я использую УСЕЧЕННЫЙ часто во время разработки, но необходимо быть осторожными об использовании ее на производственной базе данных, потому что Вы не будете в состоянии откатывать свои изменения. Необходимо сразу сделать полное резервное копирование базы данных после выполнения УСЕЧЕННОГО для установления нового основания для восстановления.

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

От MSDN:

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

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

0
ответ дан Andy Frieders 8 November 2019 в 00:41
поделиться

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

  • отбрасывание все индексы;
  • делают обычные УДАЛЯЮТ;
  • воссоздают все индексы.

Это может убыстриться, УДАЛЯЮТ несколько.

0
ответ дан squadette 8 November 2019 в 00:41
поделиться

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

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

0
ответ дан Andy Lester 8 November 2019 в 00:41
поделиться

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

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

0
ответ дан 8 November 2019 в 00:41
поделиться

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

0
ответ дан TheSmurf 8 November 2019 в 00:41
поделиться

Обратите внимание, что УСЕЧЕННЫЙ также сбросит любые автоматические ключи постепенного увеличения, если Вы будете использовать тех.

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

1
ответ дан Brian D. 8 November 2019 в 00:41
поделиться

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

1
ответ дан James A. Rosen 8 November 2019 в 00:41
поделиться

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

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
3
ответ дан dar7yl 8 November 2019 в 00:41
поделиться

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

3
ответ дан 8 November 2019 в 00:41
поделиться

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

6
ответ дан fangxing 8 November 2019 в 00:41
поделиться

Существует общий миф, которые УСЕКАЮТ так или иначе журнал транзакций пропусков.

Это неправильно понимает и ясно упоминается в MSDN.

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

15
ответ дан squadette 8 November 2019 в 00:41
поделиться

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

TRUNCATE TABLE функционально идентичен Оператору удаления без оператора Where: оба удаляют все строки в таблице. Но TRUNCATE TABLE быстрее и использует меньше системы и ресурсов журнала транзакций, чем УДАЛЯЮТ.

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

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

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

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

33
ответ дан Ron Skufca 8 November 2019 в 00:41
поделиться

На SQL Server можно использовать эти Truncate Table команда, которая быстрее, чем постоянный клиент удаляет, и также использует меньше ресурсов. Это сбросит любые поля идентификационных данных назад к значению семени также.

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

1
ответ дан Martynnw 8 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: