Все ответы зависят от платформы. В стандартном SQL нет команды TRUNCATE. Поэтому это проприетарная функция и означает разные вещи для каждого поставщика СУБД.
nvogel
Ответ очень специфичен для конкретной реализации, поскольку, как указывал sqlvogel, это нестандартная команда (TRUNCATE). Либо оставьте этот помеченный «оракул», либо давайте сделаем его ответом в стиле сообщества вики, и включим последствия для каждой основной СУБД (Oracle, MS-MSQL, PostgreSQL все реализуют TRUNCATE ...)
reedstrm
Если Transaction завершен, означает COMMITED, то мы не можем откатить команду TRUNCATE, но мы все равно можем откатить команду DELETE из файлов LOG, поскольку запись DELETE записывает их в файл журнала в случае необходимости отката в будущем из файлов LOG.
Ответы:
272
Вот список отличий. Я выдвинул на первый план специфичные для Oracle функции, и, надеюсь, сообщество также может добавить специфические отличия других поставщиков. Различия, которые являются общими для большинства поставщиков, могут идти непосредственно под заголовками, а различия выделены ниже.
Общий обзор
Если вы хотите быстро удалить все строки из таблицы, и вы действительно уверены, что хотите это сделать, и у вас нет внешних ключей к таблицам, то TRUNCATE, вероятно, будет быстрее, чем DELETE. ,
Различные системные проблемы должны быть рассмотрены, как подробно описано ниже.
Поскольку TRUNCATE является DDL, он включает в себя две фиксации, одну до и одну после выполнения оператора. Поэтому усечение нельзя откатить, и сбой в процессе усечения в любом случае приведет к фиксации.
Тем не менее, см. Воспоминание ниже.
Космическая мелиорация
Удалить не восстанавливает пространство, Truncate восстанавливает пространство
оракул
Если вы используете предложение REUSE STORAGE, то сегменты данных не выделяются, что может быть несколько более эффективным, если таблицу необходимо перезагрузить данными. Верхняя отметка сбрасывается.
Объем строки
Удалить можно использовать для удаления всех строк или только подмножества строк. Усечение удаляет все строки.
оракул
Когда таблица разделена, отдельные разделы могут быть обрезаны изолированно, таким образом, возможно частичное удаление всех данных таблицы.
Типы объектов
Удалить можно применить к таблицам и таблицам внутри кластера. Усечение применяется только к таблицам или всему кластеру. (Может быть специфичным для Oracle)
Идентичность объекта данных
оракул
Удаление не влияет на идентификатор объекта данных, но truncate назначает новый идентификатор объекта данных, если только не было вставки в таблицу с момента ее создания. Даже одна откатная вставка, при которой выполняется откат, приведет к назначению нового идентификатора объекта данных при усечении. ,
Воспоминание (Oracle)
Воспоминание работает при удалении, но усечение предотвращает возврат к состояниям до операции.
Однако, начиная с 11gR2, функция FLASHBACK ARCHIVE позволяет это делать, за исключением Express Edition.
Удаление может быть предоставлено в таблице другому пользователю или роли, но усечение не может быть выполнено без использования разрешения DROP ANY TABLE.
Redo / Undo
Удаление создает небольшое количество повторов и большое количество отмен. Усечение генерирует незначительное количество каждого.
Индексы
оракул
Операция усечения делает неиспользуемые индексы снова пригодными для использования. Удалить не надо.
Иностранные ключи
Усечение не может быть применено, когда включенный внешний ключ ссылается на таблицу. Обработка с удалением зависит от конфигурации внешних ключей.
Блокировка стола
оракул
Для усечения требуется эксклюзивная блокировка таблицы, для удаления требуется общая блокировка таблицы. Следовательно, отключение блокировок таблицы является способом предотвращения операций усечения таблицы.
Триггеры
Триггеры DML не запускаются в усеченном состоянии.
оракул
Триггеры DDL доступны.
Удаленное выполнение
оракул
Усечение не может быть выдано по ссылке в базе данных.
Идентификационные столбцы
SQL * Сервер
Функция усечения сбрасывает последовательность для типов столбцов IDENTITY, удаление - нет.
Набор результатов
В большинстве реализаций DELETEоператор может вернуть клиенту строки, которые были удалены.
Например, в подпрограмме Oracle PL / SQL вы можете:
DELETEFROM employees_temp
WHERE employee_id =299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
Не понимаю вашего четвертого утверждения: если я скажу DELETE [ ] FROM Table; тогда * все строки в этой таблице будут удалены, если FK не остановит это. Кстати, я думаю, это зависит от SQL Server, вы не можете использовать TRUNCATE для таблиц с FK.
Джо Пинеда
Еще несколько комментариев: я не согласен с вашим третьим утверждением, если оно не относится к Oracle. По крайней мере, с SQL S. Если вы удаляете DELETE или TRUNCATE, вы не восстанавливаете пространство (то есть файлы базы данных не сжимаются на жестком диске), если вы специально не попросите об этом.
Джо Пинеда
1
Пятое утверждение: вы можете откатить TRUNCATE TABLE на sql 2008 r2
Эрик Лабашоски
1
Postgresql может откатить TRUNCATE и, таким образом, также не будет автоматически фиксировать его.
rfusca
5
DELETE возвращает количество удаленных строк, а TRUNCATE - нет. Это очень глупый вопрос, но стоит упомянуть об этом :)
Дипак Кумар Джа
192
Разница между усечением и удалением указана ниже:
+----------------------------------------+----------------------------------------------+
| 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) |
+----------------------------------------+----------------------------------------------+
Усечение сброса идентификатора таблицы Что это значит? Но как насчет удаления?
Рави
1
@jWeaver: это означает, что если для свойства Identity Specification задано значение True для поля первичного ключа, то при вставке данных в эту таблицу столбец первичного ключа содержит значение, подобное 1,2,3,4,5 .... (если Identity начинается из 1 и seed равно 1), и когда вы усекаете таблицу, она потеряет все значение идентификатора, поэтому, когда вы начнете вставлять данные в эту таблицу снова, они начнутся с 1 вместо того, где они остались последними. В DELETE, наоборот, он сохраняет значение идентичности даже после выполнения инструкции DELETE. Извините за ошибку 2-й точки сравнения в столбце УДАЛИТЬ на изображении выше.
Баумик Патель
Похоже, вы отвечаете за SQL SERVER
Рави
4
И TRUNCATE, и DELETE могут быть откатаны назад в SQL SERVER . А во 2-м ряду УДАЛИТЬ дозу не сбрасывать личность. Теперь, как вы можете редактировать этот пост? Это плохо в использовании изображений в StackOverflow.
Махмуд Дженами
2
Усечение откатывается! (SQL SERVER)
Аймал Хан
55
DROP
Команда DROP удаляет таблицу из базы данных. Все строки таблиц, индексы и привилегии также будут удалены. Никакие триггеры DML не сработают. Операция не может быть отменена.
TRUNCATE
TRUNCATE удаляет все строки из таблицы. Операция не может быть отменена, и никакие триггеры не будут запущены. Таким образом, TRUNCATE работает быстрее и не использует столько места для отмены, сколько DELETE. Блокировка уровня таблицы будет добавлена при усечении.
УДАЛИТЬ
Команда DELETE используется для удаления строк из таблицы. Предложение WHERE может использоваться только для удаления некоторых строк. Если условие WHERE не указано, все строки будут удалены. После выполнения операции DELETE вам нужно выполнить COMMIT или ROLLBACK транзакцию, чтобы сделать изменение постоянным или отменить его. Обратите внимание, что эта операция вызовет срабатывание всех триггеров DELETE в таблице. Блокировка уровня строки будет добавлена при удалении.
Для пояснения, это для SQL Server, если в таблице есть столбец, определенный как IDENTITY. Удалить будет поддерживать последний автоматически назначенный идентификатор, в то время как Truncate сбрасывает счетчик.
Codewerks
Так как вопрос помечен как ORACLE, то этот ответ НЕПРАВИЛЬНЫЙ, поэтому опущен.
Парень
упс, не увидел метку оракула :)
mathieu
+1 правда, и он сбрасывает его до 0 . Если вы хотите, чтобы это было 1 вместо:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB
Я добавил это в ответ сообщества и сделал его более удобным для документирования проблем, связанных с поставщиками
Дэвид Олдридж
12
«Truncate ничего не регистрирует» правильно. Я бы пошел дальше:
Усечение не выполняется в контексте транзакции.
Преимущество усечения в скорости перед удалением должно быть очевидным. Это преимущество варьируется от тривиального до огромного, в зависимости от вашей ситуации.
Однако я видел, как усечение непреднамеренно нарушает ссылочную целостность и нарушает другие ограничения. Сила, которую вы получаете, изменяя данные вне транзакции, должна быть сбалансирована с ответственностью, которую вы наследуете, когда идете по канату без сети.
TRUNCATEявляется оператором DDL, тогда как DELETEявляется оператором DML. Ниже приведены различия между ними:
Как TRUNCATEи оператор DDL ( язык определения данных ), он не требует фиксации, чтобы сделать изменения постоянными. И это причина, по которой строки, удаленные с помощью усечения, не могут быть откачены. С другой стороны DELETE, оператор DML ( язык манипулирования данными ), следовательно, требует явного принятия, чтобы сделать его эффект постоянным.
TRUNCATEвсегда удаляет все строки из таблицы, оставляя таблицу пустой и структуру таблицы нетронутой, тогда как DELETEможет быть условно удалена, если используется предложение where.
Строки, удаленные TRUNCATE TABLEоператором, не могут быть восстановлены, и вы не можете указать предложение where в TRUNCATEоператоре.
TRUNCATEоператоры не запускают триггеры в отличие от триггера удаления на DELETEоператор
SQL-запрос TRUNCATE удаляет все строки из таблицы, не регистрируя удаления отдельных строк.
TRUNCATE - это команда DDL.
TRUNCATE выполняется с использованием блокировки таблицы, и вся таблица блокируется для удаления всех записей.
Мы не можем использовать предложение WHERE с TRUNCATE.
TRUNCATE удаляет все строки из таблицы.
Минимальная регистрация в журнале транзакций, так что это быстрее в отношении производительности.
TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только освобождения страниц в журнал транзакций.
Чтобы использовать Truncate для таблицы, вам нужно как минимум разрешение ALTER для таблицы.
Truncate использует меньше места для транзакций, чем оператор Delete.
Усечение нельзя использовать с индексированными представлениями.
TRUNCATE быстрее, чем DELETE.
УДАЛИТЬ
Для выполнения очереди DELETE требуются разрешения на удаление для целевой таблицы. Если вам нужно использовать предложение WHERE в DELETE, выберите также права доступа.
DELETE - это команда DML.
DELETE выполняется с использованием блокировки строк, каждая строка в таблице блокируется для удаления.
Мы можем использовать предложение where с DELETE для фильтрации и удаления определенных записей.
Команда DELETE используется для удаления строк из таблицы на основе условия WHERE.
Он поддерживает журнал, поэтому он медленнее, чем TRUNCATE.
Оператор DELETE удаляет строки по одной за раз и записывает запись в журнал транзакций для каждой удаленной строки.
Если вы случайно удалили все данные из таблицы, используя Delete / Truncate. Вы можете откатить совершенную транзакцию. Восстановите последнюю резервную копию и запустите журнал транзакций до того времени, когда должно произойти удаление / усечение.
При работе с базой данных мы используем Delete и Truncate, не зная различий между ними. В этой статье мы обсудим разницу между Delete и Truncate в Sql.
Удалить:
Удалить - это команда DML.
Оператор удаления выполняется с использованием блокировки строк, каждая строка в таблице блокируется для удаления.
Мы можем указать фильтры в предложении where.
Удаляет указанные данные, если существует условие.
Удалите действия триггера, потому что операция регистрируется индивидуально.
Медленнее, чем усекать, потому что он ведет журналы
Округление
Усечение - это команда DDL.
Усеченная таблица всегда блокирует таблицу и страницу, но не каждую строку. Так как она удаляет все данные.
Не может использовать Где условие.
Удаляет все данные.
Усеченная таблица не может активировать триггер, поскольку операция не регистрирует удаления отдельных строк.
Быстрее с точки зрения производительности, потому что он не ведет журналы.
Примечание. С помощью транзакции можно откатить и Удалить, и Обрезать. Если транзакция выполнена, значит зафиксирована, то мы не можем откатить команду Truncate, но мы все равно можем откатить команду Удалить из файлов журнала, так как удаляем записи записи их в файл журнала в случае необходимости отката в будущем из файлов журнала.
Если у вас есть ограничение внешнего ключа, относящееся к таблице, которую вы пытаетесь усечь, это не сработает, даже если в ссылающейся таблице нет данных. Это связано с тем, что проверка внешнего ключа выполняется с помощью DDL, а не DML. Это можно обойти, временно отключив ограничение (я) внешнего ключа для таблицы.
Удалить таблицу является зарегистрированной операцией. Таким образом, удаление каждой строки записывается в журнал транзакций, что делает его медленным. Усеченная таблица также удаляет все строки в таблице, но она не регистрирует удаление каждой строки, а записывает освобождение страниц данных таблицы, что ускоряет ее.
~ Если случайно вы удалили все данные из таблицы, используя Delete / Truncate. Вы можете откатить совершенную транзакцию. Восстановите последнюю резервную копию и запустите журнал транзакций до того времени, когда должно произойти удаление / усечение.
Команда DELETE используется для удаления строк из таблицы. Предложение WHERE может использоваться только для удаления некоторых строк. Если условие WHERE не указано, все строки будут удалены. После выполнения операции DELETE вам нужно выполнить COMMIT или ROLLBACK транзакцию, чтобы сделать изменение постоянным или отменить его. Обратите внимание, что эта операция вызовет срабатывание всех триггеров DELETE в таблице.
TRUNCATE
TRUNCATE удаляет все строки из таблицы. Операция не может быть отменена, и никакие триггеры не будут запущены. Таким образом, TRUCATE работает быстрее и не использует столько места для отмены, сколько DELETE.
DROP
Команда DROP удаляет таблицу из базы данных. Все строки таблиц, индексы и привилегии также будут удалены. Никакие триггеры DML не сработают. Операция не может быть отменена.
DROP и TRUNCATE являются командами DDL, тогда как DELETE является командой DML. Поэтому операции DELETE можно откатить (отменить), а операции DROP и TRUNCATE нельзя откатить.
TRUNCATE vs. DELETE - один из печально известных вопросов во время интервью SQL. Просто убедитесь, что вы правильно объясните это интервьюеру, иначе это может стоить вам работы. Проблема в том, что не многие знают, поэтому, скорее всего, они сочтут ответ неправильным, если вы скажете им, что YES Truncate можно откатить.
Небольшое исправление к исходному ответу - удаление также приводит к значительному количеству повторов (поскольку отмена сама защищена повторением) Это видно из вывода автотрассы:
SQL>deletefrom t1;10918rows deleted.
Elapsed:00:00:00.58
Execution Plan----------------------------------------------------------0DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)10DELETEOF'T1'21TABLE 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)10918rows processed
его старый поток, но, согласно моему пониманию, усечение только генерирует хорошее количество повторного журнала, где удаление генерирует отмену и повтор обоих.
• Удалить данные : первым делом, оба могут быть использованы для удаления строк из таблицы.
Но DELETE можно использовать для удаления строк не только из таблицы, но также из VIEW или результата OPENROWSET или OPENQUERY в зависимости от возможностей провайдера.
• Предложение FROM : с помощью команды DELETE вы также можете удалять строки из одной таблицы / представления / rowset_function_limited на основе строк из другой таблицы, используя другое предложение FROM. В этом предложении FROM вы также можете написать нормальные условия JOIN. На самом деле вы можете создать оператор DELETE из оператора SELECT, который не содержит агрегатных функций, заменив SELECT на DELETE и удалив имена столбцов.
С TRUNCATE вы не можете этого сделать.
• ГДЕ : У TRUNCATE не может быть условий WHERE, но может быть DELETE. Это означает, что с TRUNCATE вы не можете удалить конкретную строку или определенную группу строк. TRUNCATE TABLE похож на оператор DELETE без предложения WHERE.
• Производительность : TRUNCATE TABLE работает быстрее и использует меньше ресурсов системы и журнала транзакций. И одна из причин - блокировки, используемые обоими утверждениями. Оператор DELETE выполняется с использованием блокировки строк, каждая строка в таблице заблокирована для удаления. TRUNCATE TABLE всегда блокирует таблицу и страницу, но не каждую строку.
• Журнал транзакций : оператор DELETE удаляет строки по одной за раз и делает отдельные записи в журнале транзакций для каждой строки.
TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только освобождения страниц в журнал транзакций.
• Страницы : после выполнения оператора DELETE таблица все еще может содержать пустые страницы. TRUNCATE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы.
• Триггер : TRUNCATE не активирует триггеры удаления в таблице. Поэтому вы должны быть очень осторожны при использовании TRUNCATE. Никогда не следует использовать TRUNCATE, если в таблице определен триггер удаления, чтобы выполнить некоторые действия по автоматической очистке или регистрации при удалении строк.
• Столбец идентификации : если TRUNCATE содержит таблицу со столбцом идентификации, счетчик для этого столбца сбрасывается на начальное значение, определенное для столбца. Если начальное число не было определено, используется значение по умолчанию 1. DELETE не сбрасывает счетчик идентификаторов. Поэтому, если вы хотите сохранить счетчик идентификаторов, используйте вместо этого DELETE.
• Репликация : DELETE можно использовать для таблицы, используемой в репликации транзакций или репликации слиянием.
Хотя TRUNCATE нельзя использовать для таблиц, участвующих в репликации транзакций или репликации слиянием.
• Откат : оператор DELETE можно откатить.
TRUNCATE также можно откатить, если он заключен в блок TRANSACTION и сеанс не закрыт. После закрытия сессии вы не сможете откатить TRUNCATE.
• Ограничения : оператор DELETE может завершиться ошибкой, если он нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице, с ограничением FOREIGN KEY. Если команда DELETE удаляет несколько строк, и любая из удаленных строк нарушает триггер или ограничение, оператор отменяется, возвращается ошибка и строки не удаляются.
И если DELETE используется против View, этот View должен быть представлением с возможностью обновления. TRUNCATE нельзя использовать для таблицы, используемой в индексированном представлении.
TRUNCATE нельзя использовать для таблицы, на которую ссылается ограничение FOREIGN KEY, если только таблица не имеет внешнего ключа, который ссылается на себя.
Привет Мангал - спасибо за ответ, особенно за вопросы, связанные с SQL * Server. Как вы думаете, вы могли бы объединить эти моменты с принятым вики-сообществом ответом?
Дэвид Олдридж
Да, конечно, но как и где? Извините, я новичок здесь.
Мангал Пардеши
«Так что, если вы хотите сохранить счетчик идентификаторов, используйте DELETE», вы могли бы использоватьDECLARE @ai as bigintSET @ai =IDENT_CURRENT('tablename')TRUNCATE TABLE tablenameDBCC checkident('tablename', RESEED, @ai)
mpag
1
Самым большим отличием является то, что truncate не является зарегистрированной операцией, а удаление -.
Просто это означает, что в случае сбоя базы данных вы не можете восстановить данные, обработанные с помощью усечения, но с помощью удаления вы можете.
Оператор DELETE: эта команда удаляет только строки из таблицы на основе условия, указанного в предложении where, или удаляет все строки из таблицы, если условие не указано. Но это не освобождает пространство, содержащее таблицу.
Синтаксис оператора SQL DELETE:
DELETE FROM table_name [WHERE условие];
Инструкция TRUNCATE: эта команда используется для удаления всех строк из таблицы и освобождения места, содержащего таблицу.
DELETEis a DML command
DELETE you can rollbackDelete= Only Delete- so it can be rolled back
InDELETE you can write conditions usingWHERE clause
Syntax –Deletefrom[Table]where[Condition]
TRUNCATE
TRUNCATEis 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)inTRUNCATE
Syntax –Truncatetable[Table]
Еще одно отличие этих двух операций состоит в том, что если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается на 1 (или на начальное значение, определенное для столбца) в поле TRUNCATE. УДАЛЕНИЕ не имеет этого влияния.
Короче говоря, truncate ничего не регистрирует (поэтому работает намного быстрее, но не может быть отменен), тогда как удаление регистрируется (и может быть частью более крупной транзакции, приведет к откату и т. Д.). Если у вас есть данные, которые вам не нужны в таблице в dev, обычно лучше их усечь, так как вы не рискуете заполнить журнал транзакций.
Основная причина, по которой это удобно, - это когда вам нужно обновить данные в многомиллионной таблице строк, но не хотите перестраивать их. «Удалить *» будет длиться вечно, тогда как влияние Truncate на производительность будет незначительным.
Дело не в том, что усечение ничего не регистрирует в SQL Server. truncate не регистрирует никакой информации, но регистрирует освобождение страницы данных для таблицы, для которой вы запустили TRUNCATE.
и усеченная запись может быть откатом, если мы определим транзакцию в начале, и мы можем восстановить усеченную запись после ее отката. Но не может восстановить усеченные записи из резервной копии журнала транзакций после совершенной усеченной транзакции.
Усечение и удаление в SQL - это две команды, которые используются для удаления или удаления данных из таблицы. Хотя обе команды Sql довольно просты по своей природе, они могут создать массу проблем, пока вы не ознакомитесь с деталями перед их использованием. Неправильный выбор команды может привести либо к очень медленному процессу, либо к крушению сегмента журнала, если необходимо удалить слишком много данных и недостаточно сегмента журнала. Вот почему важно знать, когда использовать команды усечения и удаления в SQL, но перед их использованием вы должны знать о различиях между усечением и удалением, и на их основе мы должны быть в состоянии выяснить, когда DELETE является лучшим вариантом для удаления data или TRUNCATE должны использоваться для очистки таблиц.
Оператор DELETE может иметь предложение WHERE для удаления определенных записей, тогда как оператор TRUNCATE не требует их и уничтожает всю таблицу. Важно отметить, что оператор DELETE регистрирует удаленную дату, а оператор TRUNCATE - нет.
Еще одно отличие, специфичное для Microsoft SQL Server, заключается в том, что deleteвы можете использовать outputоператор для отслеживания того, какие записи были удалены, например:
Ответы:
Вот список отличий. Я выдвинул на первый план специфичные для 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 вы можете:
источник
Разница между усечением и удалением указана ниже:
источник
От: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
источник
Все хорошие ответы, к которым я должен добавить:
Поскольку команда
TRUNCATE TABLE
DDL (язык определения данных ), а не команда DML (язык манипулирования данными ),Delete Triggers
не выполняется.источник
Сводка удаления по сравнению с усечением в SQL-сервере.
Для полной статьи перейдите по этой ссылке: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Взято из статьи дотнет моба: Удалить Vs Truncate в SQL Server
источник
В SQL Server или MySQL, если есть PK с автоматическим приращением, truncate сбросит счетчик.
источник
DBCC CHECKIDENT (table_name, RESEED, 1)
«Truncate ничего не регистрирует» правильно. Я бы пошел дальше:
Усечение не выполняется в контексте транзакции.
Преимущество усечения в скорости перед удалением должно быть очевидным. Это преимущество варьируется от тривиального до огромного, в зависимости от вашей ситуации.
Однако я видел, как усечение непреднамеренно нарушает ссылочную целостность и нарушает другие ограничения. Сила, которую вы получаете, изменяя данные вне транзакции, должна быть сбалансирована с ответственностью, которую вы наследуете, когда идете по канату без сети.
источник
TRUNCATE
является оператором DDL, тогда какDELETE
является оператором DML. Ниже приведены различия между ними:Как
TRUNCATE
и оператор DDL ( язык определения данных ), он не требует фиксации, чтобы сделать изменения постоянными. И это причина, по которой строки, удаленные с помощью усечения, не могут быть откачены. С другой стороныDELETE
, оператор DML ( язык манипулирования данными ), следовательно, требует явного принятия, чтобы сделать его эффект постоянным.TRUNCATE
всегда удаляет все строки из таблицы, оставляя таблицу пустой и структуру таблицы нетронутой, тогда какDELETE
может быть условно удалена, если используется предложение where.Строки, удаленные
TRUNCATE TABLE
оператором, не могут быть восстановлены, и вы не можете указать предложение where вTRUNCATE
операторе.TRUNCATE
операторы не запускают триггеры в отличие от триггера удаления наDELETE
операторВот очень хорошая ссылка, относящаяся к теме.
источник
Да, DELETE медленнее, TRUNCATE быстрее. Зачем?
DELETE должен прочитать записи, проверить ограничения, обновить блок, обновить индексы и сгенерировать повтор / отмену. Все это требует времени.
TRUNCATE просто настраивает указатель в базе данных на таблицу (High Water Mark) и пуф! данные исчезли.
Это специфично для Oracle, AFAIK.
источник
TRUNCATE
SQL-запрос TRUNCATE удаляет все строки из таблицы, не регистрируя удаления отдельных строк.
УДАЛИТЬ
Для выполнения очереди DELETE требуются разрешения на удаление для целевой таблицы. Если вам нужно использовать предложение WHERE в DELETE, выберите также права доступа.
источник
Если вы случайно удалили все данные из таблицы, используя Delete / Truncate. Вы можете откатить совершенную транзакцию. Восстановите последнюю резервную копию и запустите журнал транзакций до того времени, когда должно произойти удаление / усечение.
Связанная информация ниже от сообщения в блоге :
источник
В SQL Server 2005 я считаю, что вы можете откатить усечение
источник
От: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
источник
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 можно откатить.
источник
Небольшое исправление к исходному ответу - удаление также приводит к значительному количеству повторов (поскольку отмена сама защищена повторением) Это видно из вывода автотрассы:
источник
Вот мой подробный ответ о разнице между DELETE и TRUNCATE в SQL Server.
• Удалить данные : первым делом, оба могут быть использованы для удаления строк из таблицы.
Но DELETE можно использовать для удаления строк не только из таблицы, но также из VIEW или результата OPENROWSET или OPENQUERY в зависимости от возможностей провайдера.
• Предложение FROM : с помощью команды DELETE вы также можете удалять строки из одной таблицы / представления / rowset_function_limited на основе строк из другой таблицы, используя другое предложение FROM. В этом предложении FROM вы также можете написать нормальные условия JOIN. На самом деле вы можете создать оператор DELETE из оператора SELECT, который не содержит агрегатных функций, заменив SELECT на DELETE и удалив имена столбцов.
С TRUNCATE вы не можете этого сделать.
• ГДЕ : У TRUNCATE не может быть условий WHERE, но может быть DELETE. Это означает, что с TRUNCATE вы не можете удалить конкретную строку или определенную группу строк. TRUNCATE TABLE похож на оператор DELETE без предложения WHERE.
• Производительность : TRUNCATE TABLE работает быстрее и использует меньше ресурсов системы и журнала транзакций. И одна из причин - блокировки, используемые обоими утверждениями. Оператор DELETE выполняется с использованием блокировки строк, каждая строка в таблице заблокирована для удаления. TRUNCATE TABLE всегда блокирует таблицу и страницу, но не каждую строку.
• Журнал транзакций : оператор DELETE удаляет строки по одной за раз и делает отдельные записи в журнале транзакций для каждой строки.
TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только освобождения страниц в журнал транзакций.
• Страницы : после выполнения оператора DELETE таблица все еще может содержать пустые страницы. TRUNCATE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы.
• Триггер : TRUNCATE не активирует триггеры удаления в таблице. Поэтому вы должны быть очень осторожны при использовании TRUNCATE. Никогда не следует использовать TRUNCATE, если в таблице определен триггер удаления, чтобы выполнить некоторые действия по автоматической очистке или регистрации при удалении строк.
• Столбец идентификации : если TRUNCATE содержит таблицу со столбцом идентификации, счетчик для этого столбца сбрасывается на начальное значение, определенное для столбца. Если начальное число не было определено, используется значение по умолчанию 1. DELETE не сбрасывает счетчик идентификаторов. Поэтому, если вы хотите сохранить счетчик идентификаторов, используйте вместо этого DELETE.
• Репликация : DELETE можно использовать для таблицы, используемой в репликации транзакций или репликации слиянием.
Хотя TRUNCATE нельзя использовать для таблиц, участвующих в репликации транзакций или репликации слиянием.
• Откат : оператор DELETE можно откатить.
TRUNCATE также можно откатить, если он заключен в блок TRANSACTION и сеанс не закрыт. После закрытия сессии вы не сможете откатить TRUNCATE.
• Ограничения : оператор DELETE может завершиться ошибкой, если он нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице, с ограничением FOREIGN KEY. Если команда DELETE удаляет несколько строк, и любая из удаленных строк нарушает триггер или ограничение, оператор отменяется, возвращается ошибка и строки не удаляются.
И если DELETE используется против View, этот View должен быть представлением с возможностью обновления. TRUNCATE нельзя использовать для таблицы, используемой в индексированном представлении.
TRUNCATE нельзя использовать для таблицы, на которую ссылается ограничение FOREIGN KEY, если только таблица не имеет внешнего ключа, который ссылается на себя.
источник
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
Самым большим отличием является то, что truncate не является зарегистрированной операцией, а удаление -.
Просто это означает, что в случае сбоя базы данных вы не можете восстановить данные, обработанные с помощью усечения, но с помощью удаления вы можете.
Подробнее здесь
источник
Оператор DELETE: эта команда удаляет только строки из таблицы на основе условия, указанного в предложении where, или удаляет все строки из таблицы, если условие не указано. Но это не освобождает пространство, содержащее таблицу.
Синтаксис оператора SQL DELETE:
DELETE FROM table_name [WHERE условие];
Инструкция TRUNCATE: эта команда используется для удаления всех строк из таблицы и освобождения места, содержащего таблицу.
источник
УДАЛИТЬ
TRUNCATE
Для более подробной информации посетите
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
источник
Еще одно отличие этих двух операций состоит в том, что если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается на 1 (или на начальное значение, определенное для столбца) в поле TRUNCATE. УДАЛЕНИЕ не имеет этого влияния.
источник
Короче говоря, truncate ничего не регистрирует (поэтому работает намного быстрее, но не может быть отменен), тогда как удаление регистрируется (и может быть частью более крупной транзакции, приведет к откату и т. Д.). Если у вас есть данные, которые вам не нужны в таблице в dev, обычно лучше их усечь, так как вы не рискуете заполнить журнал транзакций.
источник
Основная причина, по которой это удобно, - это когда вам нужно обновить данные в многомиллионной таблице строк, но не хотите перестраивать их. «Удалить *» будет длиться вечно, тогда как влияние Truncate на производительность будет незначительным.
источник
Не могу сделать DDL через dblink.
источник
Я бы прокомментировал сообщение Матье, но у меня пока нет представителя ...
В MySQL автоматический счетчик приращений сбрасывается с усечением, но не с удалением.
источник
Дело не в том, что усечение ничего не регистрирует в SQL Server. truncate не регистрирует никакой информации, но регистрирует освобождение страницы данных для таблицы, для которой вы запустили TRUNCATE.
и усеченная запись может быть откатом, если мы определим транзакцию в начале, и мы можем восстановить усеченную запись после ее отката. Но не может восстановить усеченные записи из резервной копии журнала транзакций после совершенной усеченной транзакции.
источник
Обрезать также можно откатить здесь пример
источник
Усечение и удаление в SQL - это две команды, которые используются для удаления или удаления данных из таблицы. Хотя обе команды Sql довольно просты по своей природе, они могут создать массу проблем, пока вы не ознакомитесь с деталями перед их использованием. Неправильный выбор команды может привести либо к очень медленному процессу, либо к крушению сегмента журнала, если необходимо удалить слишком много данных и недостаточно сегмента журнала. Вот почему важно знать, когда использовать команды усечения и удаления в SQL, но перед их использованием вы должны знать о различиях между усечением и удалением, и на их основе мы должны быть в состоянии выяснить, когда DELETE является лучшим вариантом для удаления data или TRUNCATE должны использоваться для очистки таблиц.
Пожалуйста, проверьте нажмите здесь
источник
Выпустив инструкцию TRUNCATE TABLE, вы даете SQL Server указание удалить каждую запись в таблице без ведения журналов или обработки транзакций.
источник
Оператор DELETE может иметь предложение WHERE для удаления определенных записей, тогда как оператор TRUNCATE не требует их и уничтожает всю таблицу. Важно отметить, что оператор DELETE регистрирует удаленную дату, а оператор TRUNCATE - нет.
источник
Еще одно отличие, специфичное для Microsoft SQL Server, заключается в том, что
delete
вы можете использоватьoutput
оператор для отслеживания того, какие записи были удалены, например:Вы не можете сделать это с
truncate
.источник