Вот список отличий. Я выдвинул на первый план специфичные для 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;