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

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

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

36 ответов

Решение

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


Общий обзор

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

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


Тип выписки

Удалить - DML, Усечь - DDL


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

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

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


привилегии

переменная

оракул

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


Redo / Undo

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


Индексы

оракул

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


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

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


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

оракул

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


Триггеры

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

оракул

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


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

оракул

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


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

SQL* Сервер

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


Набор результатов

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

Например, в подпрограмме Oracle PL/SQL вы можете:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

Разница между усечением и удалением указана ниже:

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

УДАЛЯТЬ

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

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

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

Взято из статьи дотнет моб: Удалить Vs Truncate в SQL Server

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

поскольку TRUNCATE TABLE команда DDL (язык определения данных), а не команда DML (язык манипулирования данными), Delete Triggers не беги.

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

TRUNCATE

Запрос TRUNCATE SQL удаляет все строки из таблицы, без регистрации удаления отдельных строк.

  • TRUNCATE - это команда DDL.
  • TRUNCATE выполняется с использованием блокировки таблицы, и вся таблица блокируется для удаления всех записей.
  • Мы не можем использовать предложение WHERE с TRUNCATE.
  • TRUNCATE удаляет все строки из таблицы.
  • Минимальная регистрация в журнале транзакций, что обеспечивает более высокую производительность.
  • TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только освобождение страниц в журнал транзакций.
  • Чтобы использовать Truncate для таблицы, вам необходимо как минимум разрешение ALTER для таблицы.
  • Truncate использует меньше места для транзакции, чем оператор Delete.
  • Усечение нельзя использовать с индексированными представлениями.
  • TRUNCATE быстрее, чем DELETE.

УДАЛЯТЬ

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

  • DELETE - это команда DML.
  • DELETE выполняется с использованием блокировки строки, каждая строка в таблице заблокирована для удаления.
  • Мы можем использовать предложение where с DELETE для фильтрации и удаления определенных записей.
  • Команда DELETE используется для удаления строк из таблицы на основе условия WHERE.
  • Он ведет журнал, поэтому работает медленнее, чем TRUNCATE.
  • Оператор DELETE удаляет строки по одной и записывает запись в журнал транзакций для каждой удаленной строки.
  • Идентификатор столбца сохраняет идентификатор. DELETE сохраняет идентификатор.
  • Чтобы использовать Delete, вам необходимо разрешение DELETE для таблицы.
  • Delete использует больше места для транзакции, чем инструкция Truncate.
  • Удалить можно использовать с индексированными представлениями.

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

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

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

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

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

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

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

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

  4. TRUNCATE операторы не запускают триггеры, в отличие от триггера удаления на DELETE заявление

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

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

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

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

Это специфично для Oracle, AFAIK.

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

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

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

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

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

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

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

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

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

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

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

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

Если вы случайно удалили все данные из таблицы, используя 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 нельзя откатить.

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

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

TRUNCATE

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

УДАЛЯТЬ

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

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

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

Еще одно отличие этих двух операций состоит в том, что если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается на 1 (или на начальное значение, определенное для столбца) в поле 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 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/

Вот краткое изложение некоторых важных различий между этими командами sql:

команда усечения sql:

1) Это команда DDL (язык определения данных), поэтому такие команды, как COMMIT и ROLLBACK, не применяются к этой команде (исключениями здесь являются PostgreSQL и MSSQL, чья реализация команды TRUNCATE позволяет использовать команду в транзакции )

2) Операцию удаления записей нельзя отменить, она происходит автоматически и необратима (кроме вышеперечисленных исключений - при условии, однако, что операция включена в блок ТРАНЗАКЦИЯ и сессия не закрыта). В случае Oracle — включает две неявные фиксации, одну до и одну после выполнения оператора. Следовательно, команда не может быть отозвана, а ошибка времени выполнения все равно приведет к коммиту.

3) Удаляет все записи из таблицы, записи нельзя ограничить удалением. Для Oracle, когда таблица разбита на разделы, отдельные разделы могут быть усечены (TRUNCATE) изолированно, что позволяет частично удалить все данные из таблицы.

4) Освобождает место, занимаемое данными в таблице (в TABLESPACE - на диске). Для Oracle — если вы используете предложение REUSE STORAGE, сегменты данных не будут откатываться назад, т. е. вы сохраните пространство от удаленных строк, выделенное для таблицы, что может быть немного более эффективным, если таблица должна быть перезагружена с данными. . Высокая оценка будет сброшена

5) TRUNCATE работает намного быстрее, чем DELETE

6) Oracle Flashback в случае TRUNCATE предотвращает возврат к предоперационным состояниям

7) Oracle - TRUNCATE не может быть предоставлен (GRANT) без использования DROP ANY TABLE

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

9) TRUNCATE нельзя использовать, когда включенный внешний ключ ссылается на другую таблицу, тогда вы можете:

  • выполнить команду: DROP CONSTRAINT, затем TRUNCATE, а затем воспроизвести ее через CREATE CONSTRAINT или
  • выполнить команду: SET FOREIGN_KEY_CHECKS = 0; затем TRUNCATE, затем: SET_FOREIGN_KEY_CHECKS = 1;

10) TRUNCATE требует монопольной блокировки таблицы, поэтому отключение монопольной блокировки таблицы — это способ предотвратить операцию TRUNCATE над таблицей.

11) Триггеры DML не срабатывают после выполнения TRUNCATE (поэтому будьте очень осторожны в этом случае, вы не должны использовать TRUNCATE, если в таблице определен триггер удаления для выполнения автоматической очистки таблицы или действия входа в систему после удаления строки). В Oracle триггеры DDL запускаются

12) Oracle - TRUNCATE нельзя использовать в случае: ссылки на базу данных 13) TRUNCATE не возвращает количество удаленных записей

14) Журнал транзакций - один журнал, указывающий освобождение страницы (удаляет данные, освобождая выделение страниц данных, используемых для хранения данных таблицы, и записывает в журнал транзакций только освобождение страниц) - более быстрое выполнение, чем DELETE. TRUNCATE нужно только настроить указатель в базе данных на таблицу (High Water Mark), и данные немедленно удаляются, поэтому он использует меньше системных ресурсов и журналов транзакций.

15) Производительность (приобретенная блокировка) - блокировка таблицы и страницы - не снижает производительность во время выполнения

16) TRUNCATE нельзя использовать для таблиц, участвующих в репликации транзакций или репликации слиянием.

SQL-команда удаления:

1) Это команда DML (язык манипулирования данными), поэтому для этой команды используются следующие команды: COMMIT и ROLLBACK.

2) Вы можете отменить операцию удаления записей с помощью команды ROLLBACK

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

4) Не освобождает место, занятое данными в таблице (в TABLESPACE - на диске)

5) DELETE работает намного медленнее, чем TRUNCATE

6) Oracle Flashback работает для DELETE

7) Oracle - для DELETE вы можете использовать команду GRANT

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

9) УДАЛИТЬ, если включенный внешний ключ ссылается на другую таблицу, может (или нет) применяться в зависимости от конфигурации внешнего ключа (если нет), пожалуйста:

  • выполнить команду: DROP CONSTRAINT, затем TRUNCATE, а затем воспроизвести ее через CREATE CONSTRAINT или
  • выполнить команду: SET FOREIGN_KEY_CHECKS = 0; затем TRUNCATE, затем: SET_FOREIGN_KEY_CHECKS = 1;

10) DELETE требует общей блокировки таблицы

11) Запускает огонь

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

13) DELETE возвращает количество удаленных записей

14) Журнал транзакций - для каждой удаленной записи (удаляет строки по одной и записывает запись в журнал транзакций для каждой удаленной строки) - более медленное выполнение, чем TRUNCATE. Таблица может по-прежнему содержать пустые страницы после выполнения оператора DELETE. DELETE необходимо читать записи, проверять ограничения, обновлять блок, обновлять индексы и генерировать повтор/отмену. Все это требует времени, следовательно, это занимает гораздо больше времени, чем с TRUNCATE.

15) Performance (acquired lock) — блокировка записи — снижает производительность при выполнении — блокируется каждая запись в таблице на удаление

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

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

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

DELETE FROM table_name [WHERE условие];

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

Самым большим отличием является то, что truncate не регистрируется, а удаление -

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

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

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

DELETE и TRUNCATE можно откатить при использовании с TRANSACTION.

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

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

Командаусечения используется для повторной инициализации таблицы, это команда DDL, которая удаляет все строки таблицы. Где DELETE - это команда DML, которая используется для удаления строки или набора строк в соответствии с некоторым условием, если условие не указано Затем эта команда удалит все строки из таблицы.

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

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

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

Еще одно отличие, специфичное для Microsoft SQL Server, заключается в delete ты можешь использовать output оператор для отслеживания того, какие записи были удалены, например:

delete from [SomeTable]
output deleted.Id, deleted.Name

Вы не можете сделать это с truncate,

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

Другие вопросы по тегам