В чем разница между TRUNCATE и DELETE в SQL - PullRequest
238 голосов
/ 26 сентября 2008

В чем разница между TRUNCATE и DELETE в SQL?

Если ваш ответ зависит от платформы, укажите это.

Ответы [ 31 ]

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

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


Общий обзор

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

Необходимо рассмотреть различные системные проблемы, как подробно описано ниже.


Тип выписки

Удаление - это DML, Усечение - это DDL ( Что такое DDL и DML? )


Фиксация и откат

Переменная от поставщика

SQL * Сервер

Усечение можно откатить.

PostgreSQL

Усечение можно откатить.

Oracle

Поскольку TRUNCATE - это DDL, он включает в себя две фиксации, одну до и одну после выполнения оператора. Поэтому усечение нельзя откатить, и сбой в процессе усечения все равно приведет к фиксации.

Однако, см. Воспоминание ниже.


мелиорация

Удалить не восстанавливает пространство, Truncate восстанавливает пространство

Oracle

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


Строка области действия

Удалить можно использовать для удаления всех строк или только подмножества строк. Усечение удаляет все строки.

Oracle

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


Типы объектов

Удалить можно применить к таблицам и таблицам внутри кластера. Усечение применяется только к таблицам или всему кластеру. (Может быть специфичен для Oracle)


Идентификация объекта данных

Oracle

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


Воспоминание (Oracle)

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

Однако, начиная с 11gR2, функция FLASHBACK ARCHIVE позволяет это, за исключением Express Edition

Использование FLASHBACK в Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Привилегии

Variable

Oracle

Удаление может быть предоставлено в таблице другому пользователю или роли, но усечение не может быть выполнено без использования разрешения DROP ANY TABLE.


Redo / Undo

Удаление создает небольшое количество повторов и большое количество отмен. Усечение генерирует незначительное количество каждого.


Индексы

Oracle

Операция усечения делает непригодные для использования индексы снова пригодными для использования. Удалить не надо.


Иностранные ключи

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


Таблица блокировки

Oracle

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


Триггеры

Триггеры DML не запускаются в усеченном состоянии.

Oracle

Доступны триггеры DDL.


Удаленное выполнение

Oracle

Усечение не может быть выдано по ссылке в базе данных.


Идентификационные столбцы

SQL * Сервер

Усечение сбрасывает последовательность для типов столбцов IDENTITY, удаление - нет.


Результирующий набор

В большинстве реализаций оператор DELETE может возвращать клиенту удаленные строки.

например. в подпрограмме Oracle PL / SQL вы могли бы:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
154 голосов
/ 15 октября 2012

Разница между усечением и удалением указана ниже:

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+
35 голосов
/ 15 апреля 2015

DROP

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

TRUNCATE

TRUNCATE удаляет все строки из таблицы. Операция не может быть отменена, и никакие триггеры не будут запущены. Таким образом, TRUCATE работает быстрее и не использует столько места для отмены, сколько DELETE.

DELETE

Команда DELETE используется для удаления строк из таблицы. Предложение WHERE может использоваться только для удаления некоторых строк. Если условие WHERE не указано, все строки будут удалены. После выполнения операции DELETE вам нужно выполнить COMMIT или ROLLBACK, чтобы сделать изменение постоянным или отменить его. Обратите внимание, что эта операция вызовет срабатывание всех триггеров DELETE в таблице.

От: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

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

Все хорошие ответы, к которым я должен добавить:

Поскольку TRUNCATE TABLE является командой DDL ( Язык определения данных ), а не командой DML ( Язык манипулирования данными ), Delete Triggers не запускается.

19 голосов
/ 14 мая 2016

Сводка удаления и усечения в SQL-сервере
Для полной статьи перейдите по этой ссылке: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/

enter image description here

Взято из статьи о dotnet mob: Удалить Vs Truncate в SQL Server

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

В SQL Server или MySQL, если есть ПК с автоматическим приращением, усечение сбрасывает счетчик.

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

«Truncate ничего не регистрирует» правильно. Я бы пошел дальше:

Усечение не выполняется в контексте транзакции.

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

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

6 голосов
/ 09 декабря 2009

TRUNCATE является оператором DDL, тогда как DELETE является оператором DML. Ниже приведены различия между ними:

  1. Поскольку TRUNCATE является оператором DDL ( Язык определения данных ), для выполнения изменений не требуется фиксация. И это причина, по которой строки, удаленные с помощью усечения, не могут быть откачены. С другой стороны, DELETE является оператором DML ( Язык манипулирования данными ), следовательно, для явного выполнения эффекта требуется явная фиксация.

  2. TRUNCATE всегда удаляет все строки из таблицы, оставляя таблицу пустой, а структуру таблицы нетронутой, тогда как DELETE может быть условно удалена, если используется предложение where.

  3. Строки, удаленные оператором TRUNCATE TABLE, не могут быть восстановлены, и вы не можете указать предложение where в операторе TRUNCATE.

  4. TRUNCATE не запускают триггеры, в отличие от триггера удаления при DELETE операторе

Здесь - очень хорошая ссылка, относящаяся к теме.

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

Да, DELETE медленнее, TRUNCATE быстрее. Зачем?

DELETE должен читать записи, проверять ограничения, обновлять блок, обновлять индексы и генерировать повтор / отмену. Все это требует времени.

TRUNCATE просто настраивает указатель в базе данных на таблицу (High Water Mark) и пуф! данные исчезли.

Это специфично для Oracle, AFAIK.

5 голосов
/ 20 августа 2014

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

Соответствующая информация ниже из сообщения в блоге :

При работе с базой данных мы используем Delete и Truncate без зная различия между ними. В этой статье мы обсудим Разница между Удалить и Обрезать в Sql.

Удалить:

  • Удалить - это команда DML.
  • Оператор удаления выполняется с использованием блокировки строк, каждая строка в таблице заблокирована для удаления.
  • Мы можем указать фильтры в предложении where.
  • Удаляет указанные данные, если существует условие.
  • Удалить действия триггера, потому что операция регистрируется индивидуально.
  • Медленнее, чем усечение, потому что он ведет журналы

Округление

  • Усечение - это команда DDL.
  • Усеченная таблица всегда блокирует таблицу и страницу, но не каждую строку. Поскольку она удаляет все данные.
  • Невозможно использовать Где условие.
  • Удаляет все данные.
  • Таблица усечений не может активировать триггер, поскольку операция не регистрирует отдельные удаления строк.
  • Быстрее с точки зрения производительности, поскольку не ведет журналы.

Примечание. При использовании с Сделка. Если сделка сделана, значит совершена, то мы не можем команда rollback Truncate, но мы все еще можем выполнить команду rollback Delete из лог файлов, так как удаляю записи, записываю их в лог файл в случае в будущем необходимо выполнить откат из файлов журнала.

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

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

~ Если вы случайно удалили все данные из таблицы, используя Удалить / Truncate. Вы можете откатить совершенную транзакцию. Восстановить Последнее резервное копирование и запуск журнала транзакций до момента, когда Удалить / Усечь вот-вот случится.

...