Подтвердить что ты не робот

Плюсы и минусы TRUNCATE против DELETE FROM

Может ли кто-нибудь дать мне краткий обзор плюсов и минусов использования следующих двух утверждений:

TRUNCATE TABLE dbo.MyTable

против

DELETE FROM dbo.MyTable

Кажется, они оба делают то же самое, когда все сказано и сделано; но должны быть различия между ними.

4b9b3361

Ответ 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 не выполняет никаких протоколирования, удаление делает, поэтому, если у вас есть тонна записей, ваш журнал транзакций огромен.