Плюсы и минусы TRUNCATE против DELETE FROM
Может ли кто-нибудь дать мне краткий обзор плюсов и минусов использования следующих двух утверждений:
TRUNCATE TABLE dbo.MyTable
против
DELETE FROM dbo.MyTable
Кажется, они оба делают то же самое, когда все сказано и сделано; но должны быть различия между ними.
Ответы
Ответ 1
TRUNCATE
не генерирует никаких данных отката, что делает его молниеносным. Он просто освобождает страницы данных, используемые таблицей.
Однако, если вы находитесь в транзакции и хотите, чтобы "отменить" это удаление, вам нужно использовать DELETE FROM
, что дает возможность отката.
EDIT:
Обратите внимание, что приведенное выше неверно для SQL Server (но оно применимо к Oracle). В SQL Server можно отменить операцию усечения, если вы находитесь внутри транзакции, и транзакция не была выполнена. С точки зрения SQL Server одним ключевым отличием между DELETE FROM и TRUNCATE является this:
"Оператор DELETE удаляет строки по одному и записывает запись в журнал транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только дезадаптации страниц в журнале транзакций."
Другими словами, во время TRUNCATE меньше регистрации, потому что в журнале транзакций записываются только дезадаптации страниц, тогда как с DELETE FROM каждая запись строки записывается. Одна из причин TRUNCATE - молниеносно.
Обратите внимание также на эту ссылку MSDN, что вы не можете обрезать таблицы, на которые ссылаются ограничения внешнего ключа, участвовать в индексированном представлении или публикуться с использованием репликации транзакций или репликации слияния.
ИЗМЕНИТЬ 2:
Другим ключевым моментом является то, что TRUNCATE TABLE будет reset вашей личностью исходному семени, тогда как DELETE FROM будет продолжать увеличиваться с того места, где оно было остановлено.
Ссылка: Бен Робинсон отвечает.
Ответ 2
Еще один ключевой момент, не упомянутый в других ответах, заключается в том, что TRUNCATE TABLE
будет reset вашей личностью исходному семени, тогда как DELETE FROM
будет продолжать увеличиваться с того места, где оно было остановлено.
Ответ 3
Другое отличие от перспективы безопасности заключается в том, что TRUNCATE требует привилегий ALTER в таблице, тогда как DELETE просто требует (барабанную ручку) DELETE-разрешений для этой таблицы.
Ответ 4
TRUNCATE TABLE
не регистрирует транзакцию. Это означает, что для больших столов он молниеносно. Недостатком является то, что вы не можете отменить операцию.
DELETE FROM
регистрирует каждую строку, которая удаляется в журналах транзакций, поэтому операция занимает некоторое время и приводит к резкому увеличению ваших журналов транзакций. Положительным моментом является то, что вы можете отменить операцию, если это необходимо.
Ответ 5
Я считаю, что Delete и Truncate можно отменить только в том случае, если операция была выполнена и явная транзакция. В противном случае вам придется выполнить восстановление для восстановления удаленных данных.
Ответ 6
Основное различие заключается в том, как они регистрируются. DELETE и TRUNCATE регистрируются по-разному, но оба могут быть отброшены точно так же. Все операции, которые изменяют данные, регистрируются. В SQL Server нет такой операции, как операция без регистрации.
Ответ 7
Одна вещь, которая очень важна (imo) и не упоминается в других ответах, заключается в том, что TRUNCATE
требуется блокировка стабильности схемы, Sch-S
, тогда как DELETE
использует блокировки строк. Давайте проверим следующее:
BEGIN TRANSACTION;
BEGIN TRY
-- Truncate below will take LCK_M_SCH_S lock for TABLE_A
TRUNCATE TABLE TABLE_A
-- Lets say the query below takes 5 hours to execute
INSERT INTO
TABLE_A
SELECT
*
FROM
GIANT_TABLE (NOLOCK)
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
THROW
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
Предположим, что через 1-2 минуты после начала этого запроса предположим, что мы попытались выполнить следующее:
SELECT COUNT(*) FROM TABLE_A (NOLOCK)
Обратите внимание, что я использовал предложение NOLOCK
. Как вы думаете, что произойдет сейчас? Этот запрос будет ждать 5 часов. Зачем? Поскольку NOLOCK
требует Sch-S
блокировки TABLE_A
, но это предложение TRUNCATE
имеет Sch-S
на нем уже. Поскольку мы еще не совершили транзакцию, блокировка по-прежнему включена даже после этого предложения TRUNCATE
. Sch-S
Блокировка таблицы в основном означает, что либо TABLE_A
изменяется, добавляя/удаляя столбцы и т.д., либо он усекается. Вы даже не можете выполнить что-то вроде ниже:
SELECT object_id('TABLE_A')
Это застряло бы 5 часов. Однако, если вы замените TRUNCATE
на DELETE FROM
, вы увидите, что в таблице не будет блокировки Sch-S
, и указанные выше запросы не будут застряли.
Ответ 8
Другим различием между DELETE
vs TRUNCATE
является поведение, когда таблица повреждена.
Например:
DELETE FROM table_name;
В результате получится ошибка:
Msg 3314, уровень 21, состояние 3, строка 1
При отмене зарегистрированной операции в базе данных "..." произошла ошибка в ID записи журнала(). Как правило, конкретный сбой регистрируется ранее как ошибка в службе журнала событий Windows. Восстановите базу данных или файл из резервной копии или восстановите базу данных.
Msg 0, уровень 20, состояние 0, строка 0
Серьезная ошибка произошла в текущей команде. Результаты, если таковые имеются, должны быть отброшены.
Пока TRUNCATE
будет работать:
TRUNCATE TABLE table_name;
-- Command(s) completed successfully.
Ответ 9
Схема удаления Vs Truncate на сервере SQL
Для полной статьи возьмите после этого соединения: Удалить Vs Truncate в SQL Server
![введите описание изображения здесь]()
/*Truncate - Syntax*/
TRUNCATE TABLE table_name
/*Delete - Syntax*/
DELETE FROM table_name
WHERE some_condition
Ответ 10
$connection = $this->getEntityManager()->getConnection();
$connection->exec("Truncate TABLE <tablename>;");
Ответ 11
truncate не выполняет никаких протоколирования, удаление делает, поэтому, если у вас есть тонна записей, ваш журнал транзакций огромен.