В чем разница между усечением и удалением в SQL


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

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

30 201

30 ответов:

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


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

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

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


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

Delete - это DML, Truncate-DDL


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

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

SQL * Server

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

PostgreSQL

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

Oracle

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

тем не менее, см. Flashback ниже.


космос рекультивация

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

Oracle

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


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

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

Oracle

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


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

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


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

Oracle

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


Flashback (Oracle)

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

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

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


льготы

переменная

Oracle

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


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

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


индексы

Oracle

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


внешняя Ключи

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


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

Oracle

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


триггеры

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

Oracle

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


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

Oracle

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


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

SQL * Server

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


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

в большинстве реализаций, 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 не будут запущены. Откат операции невозможен.

усечь

усечение удаляет все строки из таблицы. Операция не может быть откатана, и никакие триггеры не будут запущены. Таким образом, 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, если есть PK с автоматическим приращением, усечение сбросит счетчик.

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

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

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

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

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

enter image description here

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

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

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

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

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

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

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

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

удалить:

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

усечь

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

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

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

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

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

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

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

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

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

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

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

усечь

  • это быстрее и использует меньше ресурсов системы и журналов транзакций, чем DELETE.
  • удаляет данные путем освобождения страниц данных, используемых для хранения данных таблицы, и только освобождение страниц записывается в журнал транзакций.
  • удаляет все строки из таблицы, но структура таблицы, ее столбцы, ограничения, индексы и т. д. остаются. Счетчик используется удостоверение сбрасывается в начальное колонна.
  • вы не можете использовать TRUNCATE TABLE на таблицу, на которую ссылается a 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 не будут запущены. Откат операции невозможен.


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

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

небольшая поправка к исходному ответу-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

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

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

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. Просто убедитесь, что вы правильно объясните интервьюеру, или это может стоить вам работы. Проблема в том, что не многие знают, поэтому, скорее всего, они будут считать ответ неправильным, если вы скажете им, что да усечение может быть откат.

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

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

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

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

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

удаляем from имя_таблицы [where условие];

оператор 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 и TRUNCATE в SQL Server

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

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

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

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

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

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

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

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

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

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

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

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

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

Не могу сделать DDL через dblink.

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

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

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

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

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

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

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

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

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

удалить

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

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

DROP

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

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