Какая разница между TRUNCATE и DELETE в SQL

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

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

Ответ 1

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


Общий обзор

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

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


Тип выписки

Удалить - это DML, Truncate - это DDL (Что такое DDL и DML?)


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

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

SQL * Сервер

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

PostgreSQL

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

оракул

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

Тем не менее, см. Воспоминание ниже.


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

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

оракул

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


Объем строки

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

оракул

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


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

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


Идентичность объекта данных

оракул

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


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

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

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

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


привилегии

переменная

оракул

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


Redo/Undo

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


Индексы

оракул

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


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

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


Блокировка стола

оракул

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


Триггеры

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

оракул

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


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

оракул

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


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

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;

Ответ 2

Разница между усечением и удалением приведена ниже:

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

Ответ 3

DROP

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

TRUNCATE

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

Удалить

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

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

Ответ 4

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

Так как TRUNCATE TABLE является DDL (Data Defination Language), а не DML (Data Manipulation Langauge), Delete Triggers не запускается.

Ответ 6

С SQL Server или MySQL, если есть PK с автоматическим приращением, truncate будет reset счетчиком.

Ответ 7

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

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

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

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

Ответ 8

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

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

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

Это конкретный Oracle, AFAIK.

Ответ 9

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

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

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

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

    Операторы
  • TRUNCATE не запускают триггеры, а не триггер delete в DELETE statement

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

Ответ 10

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

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

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

Удалять:

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

усекать

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

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

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

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

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

Ответ 11

В SQL Server 2005 я считаю, что вы можете откат обрезать

Ответ 12

TRUNCATE

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

DELETE

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

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

Ответ 13

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

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

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

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

Ответ 14

Удалить

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

TRUNCATE

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

DROP

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


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

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

Ответ 15

Небольшая поправка к исходному ответу - delete также генерирует значительные количества повтора (поскольку отменяет сам защищенный повтор). Это видно из вывода 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

Ответ 16

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

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

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

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

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

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

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

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

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

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

Откат: оператор DELETE может быть откат.
TRUNCATE также может быть откат, если он заключен в блок TRANSACTION, а сеанс не закрыт. Когда сеанс закрыт, вы не сможете отменить TRUNCATE.

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

Ответ 17

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

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

Подробнее здесь

Ответ 18

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

Синтаксис оператора SQL DELETE:

УДАЛИТЬ ИЗ table_name [условие WHERE];

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

Ответ 19

DELETE

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

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/

Ответ 20

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

Ответ 21

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

Ответ 22

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

Ответ 23

Невозможно выполнить DDL через dblink.

Ответ 24

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

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

Ответ 25

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

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

Ответ 26

Усечение также можно отбросить здесь exapmle

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

Ответ 27

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

Обратите внимание: нажмите здесь

Ответ 28

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

Ответ 29

УДАЛИТЬ

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

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

DROP

Ответ 30

DELETE и TRUNCATE оба могут быть отброшены при использовании с TRANSACTION.

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