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

Я написал ответ на этот вопрос по ошибке в ответ на вопрос о разнице между DROP и TRUNCATE, но я подумал, что стыдно не делиться, поэтому я отправлю свой собственный ответ на свой вопрос ... это вообще этично? :)

Edit: если ваш ответ специфичен для платформы, вы можете указать это.

30 ответов


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


Общие Сведения

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

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


заявление типа

Delete - это DML, Truncate-DDL


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

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

SQL * Server

усечение можно свернуть спина.

PostgreSQL

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

Oracle

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

однако, см. Flashback ниже.


космос мелиорация

Delete не восстанавливает пространство, усечение восстанавливает пространство

Oracle

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


область строку

Delete можно использовать для удаления всех строк или только подмножества строк. Инструкция truncate удаляет все строки.

Oracle

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


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

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


Сведения Личность

Oracle

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


Flashback (Oracle)

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

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

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


льготы

переменная

Oracle

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


Повтор/Отменить

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


индексы

Oracle

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


внешняя Ключи!--8-->

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


Таблица Замок

Oracle

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


триггеры

триггеры DML не срабатывают при усечении.

Oracle

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


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

Oracle

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


личность Колонки

SQL * Server

Truncate сбрасывает последовательность для типов столбцов идентификаторов, delete - нет.


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

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

например, в подпрограмме Oracle PL / SQL вы можете:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

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

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+

DROP

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

усечь

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

удалить

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

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


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

С TRUNCATE TABLE является DDL (Язык Дефинации Данных), а не DML (Манипуляция Данными Langauge команды), то Delete Triggers не работают.


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


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

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

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

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


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

enter image description here

взято из статьи dotnet mob:удалить Vs усечь в SQL Server


да, удаление медленнее, усечение быстрее. Почему?

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

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

Это специфический Oracle, AFAIK.


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

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

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

удалить:

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

усечь

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

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

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

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

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


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

  1. As TRUNCATE является DDL (язык определения данных) заявление, она не требует фиксации, чтобы сделать изменения постоянными. И именно по этой причине строки, удаленные truncate, не могут быть откатаны. С другой стороны!--1--> является DML (язык манипулирования данными) оператор, следовательно, требует явной фиксации чтобы сделать эффект постоянным.

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

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

  4. TRUNCATE операторы не запускают триггеры в отличие от на Удалить триггер на DELETE сообщении

здесь - это очень хорошая ссылка отношение к теме.


усечь

  • это быстрее и использует меньше ресурсов системы и журналов транзакций, чем DELETE.
  • удаляет данные путем освобождения страниц данных, используемых для хранения данных таблицы, и только освобождение страниц записывается в журнал транзакций.
  • удаляет все строки из таблицы, но структуру таблицы, столбцы, ограничения, индексы и так далее, остается. Счетчик используется удостоверение сбрасывается в начальное колонна.
  • вы не можете использовать TRUNCATE TABLE в таблице, на которую ссылается FOREIGN KEY ограничения. Потому что TRUNCATE TABLE не регистрируется, он не может активировать триггер.
  • не может быть откат.
  • это команда DDL.
  • сбрасывает идентификатор таблицы

удалить

  • удаляет строки по одной и записывает запись в журнал транзакций для каждой удаленной строки.
  • если вы хотите сохранить идентичность счетчик, используйте . Если вы хотите удалить определение таблицы и данные, используйте DROP TABLE заявление.
  • можно использовать С или без WHERE п.
  • активирует триггеры.
  • может быть откат.
  • это команда DML.
  • не сбрасывает идентификатор таблицы.

Примечание: DELETE и TRUNCATE оба могут быть откатаны, когда окружены TRANSACTION если текущая сессия не закрыта. Если TRUNCATE написано в Редакторе запросов в окружении TRANSACTION и если сеанс закрыт, его нельзя откатить, но DELETE можно откатить назад.


в SQL Server 2005 я считаю, что вы can откат усечения


удалить

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

усечь

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

DROP

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


DROP и TRUNCATE-это команды DDL, тогда как DELETE-это команда DML. Поэтому операции удаления можно откатить (отменить), а операции удаления и усечения нельзя откатить.

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


небольшая поправка к исходному ответу-delete также генерирует значительное количество повторов (поскольку undo сам защищен повтором). Это видно из вывода autotrace:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed

усечение можно откатить, если обернуть транзакцию.

пожалуйста, посмотрите две ссылки ниже, и проверьте себя:-

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

усечение против удаления является одним из печально известные вопросы во время интервью SQL. Просто убедитесь, что вы правильно объясните интервьюеру, или это может стоить вам работы. Проблема в том, что не многие знают, поэтому, скорее всего, они сочтут ответ неправильным, если вы скажете им, что да усечение может быть откат.


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

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

более подробная информация здесь


инструкция DELETE: эта команда удаляет только строки из таблицы на основе условия, указанного в предложении where, или удаляет все строки из таблицы, если условие не указано. Но это не освобождает пространство, содержащее таблицу.

синтаксис инструкции SQL DELETE:

удалить из table_name [где условие];

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


удалить

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax – Delete from [Table] where [Condition]

усечь

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax – Truncate table [Table]

для получения более подробной информации посетите

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/


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


вот мой подробный ответ на разница между DELETE и TRUNCATE в SQL Server

Удалить Данные: во-первых, сначала оба могут быть использованы для удаления строк из таблицы.
Но DELETE может использоваться для удаления строк не только из таблицы, но и из представления или результата OPENROWSET или OPENQUERY в зависимости от возможностей поставщика.

из п.: С DELETE вы также можете удалить строки из одна таблица / представление / rowset_function_limited на основе строк из другой таблицы с помощью другого предложения FROM. В этом предложении FROM вы также можете написать нормальные условия соединения. Фактически вы можете создать инструкцию DELETE из инструкции SELECT, которая не содержит агрегатных функций, заменив SELECT на DELETE и удалив имена столбцов.
С TRUNCATE вы не можете этого сделать.

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

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

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

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

триггер: TRUNCATE не активирует триггеры удаления в таблице. Поэтому вы должны быть очень осторожны при использовании TRUNCATE. Никогда не следует использовать усечение, если триггер delete определен в таблице для автоматической очистки или ведения журнала при удалении строк.

Столбец Identity : С усечением если таблица содержит столбец идентификатора, счетчик для этого столбец сбрасывается до начального значения, определенного для столбца. Если семя не определено, используется значение по умолчанию 1. DELETE не сбрасывает счетчик идентификаторов. Поэтому, если вы хотите сохранить счетчик идентификаторов, используйте вместо этого DELETE.

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

откат : оператор DELETE может быть откат.
Усечение также можно откатить, если оно заключено в блок транзакций и сеанс не закрыт. После закрытия сеанса вы не сможете откатить усечение.

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


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


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


не может сделать DDL через dblink.


Я бы прокомментировал сообщение Матье, но у меня еще нет представителя...

в MySQL счетчик автоматического приращения сбрасывается с усечением, но не с удалением.


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

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


усечь также может быть время отката, вот пример

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

усечение и удаление в SQL-это две команды, которые используются для удаления или удаления данных из таблицы. Хотя довольно простой по своей природе обе команды Sql могут создать много проблем, пока вы не знакомы с деталями перед его использованием. Неправильный выбор команды может привести либо к очень медленному процессу, либо даже к взрыву сегмента журнала, если нужно удалить слишком много данных, а сегмента журнала недостаточно. Вот почему важно знать, когда использовать команду truncate и delete в SQL, но перед использованием вы должны знать о различиях между Truncate и Delete, и на их основе мы сможем узнать, когда DELETE является лучшим вариантом для удаления данных, или TRUNCATE должен использоваться для очистки таблиц.

см. Проверить нажмите здесь


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


удалить

когда оператор DELETE выполняется без предложения WHERE, он удалит все строки. Однако при вставке новой записи значение идентификатора увеличивается с 11(max identity ) до 12. Он не сбрасывается, а продолжает увеличиваться. усечь

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

DROP


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

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