В чем разница между усечением и удалением в SQL
Я написал ответ на этот вопрос по ошибке в ответ на вопрос о разнице между DROP
и TRUNCATE
, но я подумал, что стыдно не поделиться, поэтому я опубликую свой собственный ответ на мой собственный вопрос ... это вообще этично? :)
Edit: если ваш ответ зависит от платформы, вы можете указать это.
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
не работают.
"усечение ничего не регистрирует" правильно. Я бы пошел дальше:
усечение не выполняется в контексте транзакции.
преимущество скорости усечения над удалением должно быть очевидным. Это преимущество колеблется от тривиального до огромного, в зависимости от вашей ситуации.
однако я видел, как усечение непреднамеренно нарушает ссылочную целостность и нарушает другие ограничения. Сила, которую вы получаете, изменяя данные вне транзакции, имеет чтобы быть сбалансированным с ответственностью, которую вы наследуете, когда идете по канату без сети.
сводка Delete Vs Truncate в SQL server
Для получения полной статьи перейдите по этой ссылке:http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/взято из статьи 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. Ниже приведены различия между ними:
как
TRUNCATE
является DDL (язык определения данных) заявление, она не требует фиксации, чтобы сделать изменения постоянными. И именно по этой причине строки, удаленные усечением, не могут быть откатаны. С другой стороныDELETE
- это DML (язык манипулирования данными) заявление, следовательно, требует явной фиксации чтобы сделать эффект постоянным.
TRUNCATE
всегда удаляет все строки из таблицы, оставляя таблицу пустой и структуру таблицы нетронутой, тогда какDELETE
может удалить условно, если используется предложение where.строки удалены
TRUNCATE TABLE
оператор не может быть восстановлен, и вы не можете указать предложение where вTRUNCATE
заявление.
TRUNCATE
операторы не запускают триггеры в отличие от на Удалить триггер наDELETE
сообщенииздесь - это очень хорошая ссылка отношение к теме.
усечь
- это быстрее и использует меньше ресурсов системы и журналов транзакций, чем
DELETE
.- удаляет данные путем освобождения страниц данных, используемых для хранения данных таблицы, и только освобождение страниц записывается в журнал транзакций.
- удаляет все строки из таблицы, но структура таблицы, ее столбцы, ограничения, индексы и т. д. остаются. Счетчик используется удостоверение сбрасывается в начальное колонна.
- вы не можете использовать
TRUNCATE TABLE
на таблицу, на которую ссылается aFOREIGN KEY
ограничения. Потому чтоTRUNCATE TABLE
не регистрируется, он не может активировать триггер.- не может быть откат.
- это команда DDL.
- сбрасывает идентификатор таблицы
удалить
- удаляет строки по одной и записывает запись в журнал транзакций для каждой удаленной строки.
- если вы хотите сохранить идентичность счетчик, используйте . Если вы хотите удалить определение таблицы и данные, используйте
DROP TABLE
заявление.- можно использовать С или без
WHERE
п.- активирует триггеры.
- можно откатить назад.
- это команда DML.
- не сбрасывает идентификатор таблицы.
Примечание:
DELETE
иTRUNCATE
оба могут быть откатаны в окруженииTRANSACTION
если текущая сессия не закрыта. ЕслиTRUNCATE
пишется в Редакторе запросов в окруженииTRANSACTION
и если сессия закрыта, она не может быть откат, ноDELETE
можно откатить назад.
удалить
команда 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
усечение можно откатить, если завернуть в транзакцию.
пожалуйста, посмотрите две ссылки ниже, и проверьте себя:-
усечение против удаления является одним из печально известные вопросы во время интервью 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, обычно лучше усечь, поскольку вы не рискуете заполнить журнал транзакций
большая причина, по которой это удобно,-это когда вам нужно обновить данные в многомиллионной таблице строк, но не хотите ее перестраивать. "Удалить *" займет вечность, в то время как влияние усечения на производительность будет незначительным.
Я бы прокомментировал сообщение Матье, но у меня еще нет репутации...
в 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 записывает их в файл журнала в случае необходимости отката в будущем из файлов журнала.