Какая разница между TRUNCATE
и DELETE
в SQL?
Если ваш ответ зависит от платформы, укажите это.
Какая разница между TRUNCATE
и DELETE
в SQL?
Если ваш ответ зависит от платформы, укажите это.
Ответы:
Вот список отличий. Я выдвинул на первый план специфичные для Oracle функции, и, надеюсь, сообщество также может добавить специфические отличия других поставщиков. Различия, которые являются общими для большинства поставщиков, могут идти непосредственно под заголовками, а различия выделены ниже.
Если вы хотите быстро удалить все строки из таблицы, и вы действительно уверены, что хотите это сделать, и у вас нет внешних ключей к таблицам, то TRUNCATE, вероятно, будет быстрее, чем DELETE. ,
Различные системные проблемы должны быть рассмотрены, как подробно описано ниже.
Удалить - это DML, Truncate - это DDL ( Что такое DDL и DML? )
Переменная поставщиком
SQL * Сервер
Усечение можно откатить.
PostgreSQL
Усечение можно откатить.
оракул
Поскольку TRUNCATE является DDL, он включает в себя две фиксации, одну до и одну после выполнения оператора. Поэтому усечение нельзя откатить, и сбой в процессе усечения в любом случае приведет к фиксации.
Тем не менее, см. Воспоминание ниже.
Удалить не восстанавливает пространство, Truncate восстанавливает пространство
оракул
Если вы используете предложение REUSE STORAGE, то сегменты данных не выделяются, что может быть несколько более эффективным, если таблицу необходимо перезагрузить данными. Верхняя отметка сбрасывается.
Удалить можно использовать для удаления всех строк или только подмножества строк. Усечение удаляет все строки.
оракул
Когда таблица разделена, отдельные разделы могут быть обрезаны изолированно, таким образом, возможно частичное удаление всех данных таблицы.
Удалить можно применить к таблицам и таблицам внутри кластера. Усечение применяется только к таблицам или всему кластеру. (Может быть специфичным для Oracle)
оракул
Удаление не влияет на идентификатор объекта данных, но truncate назначает новый идентификатор объекта данных, если только не было вставки в таблицу с момента ее создания. Даже одна откатная вставка, при которой выполняется откат, приведет к назначению нового идентификатора объекта данных при усечении. ,
Воспоминание работает при удалении, но усечение предотвращает возврат к состояниям до операции.
Однако, начиная с 11gR2, функция FLASHBACK ARCHIVE позволяет это делать, за исключением Express Edition.
Использование FLASHBACK в Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
переменная
оракул
Удаление может быть предоставлено в таблице другому пользователю или роли, но усечение не может быть выполнено без использования разрешения DROP ANY TABLE.
Удаление создает небольшое количество повторов и большое количество отмен. Усечение генерирует незначительное количество каждого.
оракул
Операция усечения делает неиспользуемые индексы снова пригодными для использования. Удалить не надо.
Усечение не может быть применено, когда включенный внешний ключ ссылается на таблицу. Обработка с удалением зависит от конфигурации внешних ключей.
оракул
Для усечения требуется эксклюзивная блокировка таблицы, для удаления требуется общая блокировка таблицы. Следовательно, отключение блокировок таблицы является способом предотвращения операций усечения таблицы.
Триггеры 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;
Разница между усечением и удалением указана ниже:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
DROP
Команда DROP удаляет таблицу из базы данных. Все строки таблиц, индексы и привилегии также будут удалены. Никакие триггеры DML не сработают. Операция не может быть отменена.
TRUNCATE
TRUNCATE удаляет все строки из таблицы. Операция не может быть отменена, и никакие триггеры не будут запущены. Таким образом, TRUNCATE работает быстрее и не использует столько места для отмены, сколько DELETE. Блокировка уровня таблицы будет добавлена при усечении.
УДАЛИТЬ
Команда DELETE используется для удаления строк из таблицы. Предложение WHERE может использоваться только для удаления некоторых строк. Если условие WHERE не указано, все строки будут удалены. После выполнения операции DELETE вам нужно выполнить COMMIT или ROLLBACK транзакцию, чтобы сделать изменение постоянным или отменить его. Обратите внимание, что эта операция вызовет срабатывание всех триггеров DELETE в таблице. Блокировка уровня строки будет добавлена при удалении.
От: 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. Вы можете откатить совершенную транзакцию. Восстановите последнюю резервную копию и запустите журнал транзакций до того времени, когда должно произойти удаление / усечение.
Связанная информация ниже от сообщения в блоге :
При работе с базой данных мы используем Delete и Truncate, не зная различий между ними. В этой статье мы обсудим разницу между Delete и Truncate в Sql.
Удалить:
- Удалить - это команда DML.
- Оператор удаления выполняется с использованием блокировки строк, каждая строка в таблице блокируется для удаления.
- Мы можем указать фильтры в предложении where.
- Удаляет указанные данные, если существует условие.
- Удалите действия триггера, потому что операция регистрируется индивидуально.
- Медленнее, чем усекать, потому что он ведет журналы
Округление
- Усечение - это команда DDL.
- Усеченная таблица всегда блокирует таблицу и страницу, но не каждую строку. Так как она удаляет все данные.
- Не может использовать Где условие.
- Удаляет все данные.
- Усеченная таблица не может активировать триггер, поскольку операция не регистрирует удаления отдельных строк.
- Быстрее с точки зрения производительности, потому что он не ведет журналы.
Примечание. С помощью транзакции можно откатить и Удалить, и Обрезать. Если транзакция выполнена, значит зафиксирована, то мы не можем откатить команду Truncate, но мы все равно можем откатить команду Удалить из файлов журнала, так как удаляем записи записи их в файл журнала в случае необходимости отката в будущем из файлов журнала.
Если у вас есть ограничение внешнего ключа, относящееся к таблице, которую вы пытаетесь усечь, это не сработает, даже если в ссылающейся таблице нет данных. Это связано с тем, что проверка внешнего ключа выполняется с помощью DDL, а не DML. Это можно обойти, временно отключив ограничение (я) внешнего ключа для таблицы.
Удалить таблицу является зарегистрированной операцией. Таким образом, удаление каждой строки записывается в журнал транзакций, что делает его медленным. Усеченная таблица также удаляет все строки в таблице, но она не регистрирует удаление каждой строки, а записывает освобождение страниц данных таблицы, что ускоряет ее.
~ Если случайно вы удалили все данные из таблицы, используя Delete / Truncate. Вы можете откатить совершенную транзакцию. Восстановите последнюю резервную копию и запустите журнал транзакций до того времени, когда должно произойти удаление / усечение.
В SQL Server 2005 я считаю, что вы можете откатить усечение
УДАЛИТЬ
Команда 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
TRUNCATE можно откатить, если он включен в транзакцию.
Пожалуйста, посмотрите две ссылки ниже и проверьте себя: -
TRUNCATE vs. DELETE - один из печально известных вопросов во время интервью SQL. Просто убедитесь, что вы правильно объясните это интервьюеру, иначе это может стоить вам работы. Проблема в том, что не многие знают, поэтому, скорее всего, они сочтут ответ неправильным, если вы скажете им, что YES Truncate можно откатить.
Небольшое исправление к исходному ответу - удаление также приводит к значительному количеству повторов (поскольку отмена сама защищена повторением) Это видно из вывода автотрассы:
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
Вот мой подробный ответ о разнице между 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)
Оператор DELETE: эта команда удаляет только строки из таблицы на основе условия, указанного в предложении where, или удаляет все строки из таблицы, если условие не указано. Но это не освобождает пространство, содержащее таблицу.
Синтаксис оператора SQL DELETE:
DELETE FROM table_name [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
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/
Короче говоря, truncate ничего не регистрирует (поэтому работает намного быстрее, но не может быть отменен), тогда как удаление регистрируется (и может быть частью более крупной транзакции, приведет к откату и т. Д.). Если у вас есть данные, которые вам не нужны в таблице в dev, обычно лучше их усечь, так как вы не рискуете заполнить журнал транзакций.
Основная причина, по которой это удобно, - это когда вам нужно обновить данные в многомиллионной таблице строк, но не хотите перестраивать их. «Удалить *» будет длиться вечно, тогда как влияние Truncate на производительность будет незначительным.
Не могу сделать DDL через dblink.
Дело не в том, что усечение ничего не регистрирует в SQL Server. truncate не регистрирует никакой информации, но регистрирует освобождение страницы данных для таблицы, для которой вы запустили TRUNCATE.
и усеченная запись может быть откатом, если мы определим транзакцию в начале, и мы можем восстановить усеченную запись после ее отката. Но не может восстановить усеченные записи из резервной копии журнала транзакций после совершенной усеченной транзакции.
Обрезать также можно откатить здесь пример
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
Усечение и удаление в SQL - это две команды, которые используются для удаления или удаления данных из таблицы. Хотя обе команды Sql довольно просты по своей природе, они могут создать массу проблем, пока вы не ознакомитесь с деталями перед их использованием. Неправильный выбор команды может привести либо к очень медленному процессу, либо к крушению сегмента журнала, если необходимо удалить слишком много данных и недостаточно сегмента журнала. Вот почему важно знать, когда использовать команды усечения и удаления в SQL, но перед их использованием вы должны знать о различиях между усечением и удалением, и на их основе мы должны быть в состоянии выяснить, когда DELETE является лучшим вариантом для удаления data или TRUNCATE должны использоваться для очистки таблиц.
Пожалуйста, проверьте нажмите здесь
Еще одно отличие, специфичное для Microsoft SQL Server, заключается в том, что delete
вы можете использовать output
оператор для отслеживания того, какие записи были удалены, например:
delete from [SomeTable]
output deleted.Id, deleted.Name
Вы не можете сделать это с truncate
.