2010-07-15 2 views
49

Может кто-нибудь дать мне краткий обзор плюсов и минусов, используя следующие два утверждения:Плюсы и минусы TRUNCATE против DELETE FROM

TRUNCATE TABLE dbo.MyTable 

против

DELETE FROM dbo.MyTable 

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

ответ

70

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

Однако, если вы находитесь в транзакции и хотите отменить «удаление» этого удаления, вам необходимо использовать DELETE FROM, что дает возможность отката.

EDIT: Обратите внимание, что приведенное выше неверно для SQL Server (но оно применимо к Oracle). В SQL Server можно отменить операцию усечения, если вы находитесь внутри транзакции, и транзакция не была выполнена. С точки зрения SQL Server одно ключевое различие между DELETE FROM и TRUNCATE равно this: «Оператор DELETE удаляет строки по одному и записывает запись в журнал транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные, освобождая данные страниц, используемых для хранения данных таблицы, и записывает только дезадаптации страниц в журнале транзакций ».

Другими словами, во время TRUNCATE регистрируется меньше записей, поскольку в журнале транзакций записываются только дезадаптации страниц, тогда как с DELETE FROM каждая запись строки записывается. Это одна из причин, по которой TRUNCATE молниеносно.

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

EDIT 2: Другим ключевым моментом является то, что TRUNCATE TABLE сбросит свою идентичность в исходных семенах, в то время как DELETE FROM будет вести приращением, откуда она была прервана. Справка: Бен Робинсон ответ.

+3

'TRUNCATE' может также нарушить консистенцию (= не проверяет для внешних ключей, и не срабатывают триггеры) – nothrow

+13

@Yossarian - Согласно MSDN: «Вы не можете использовать TRUNCATE TABLE в таблице, на которую ссылается ограничение FOREIGN KEY; вместо этого, используйте инструкцию DELETE без предложения WHERE ». http://msdn.microsoft.com/en-us/library/aa260621%28SQL.80%29.aspx – dcp

+4

truncate can alos можно закатить. http: // sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx – Dhananjay

-2

усечение не делает каких-либо протоколирования, удаление делает, поэтому если у вас есть тонна записей, ваш транс журнал огромна

4

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

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

+2

TRUNCATE зарегистрирован и может быть отменен так же, как DELETE - с помощью ROLLBACK или RESTORE. – sqlvogel

+1

, только если вы используете транзакции, и если усечка совершена, ее нельзя отменить. это DDL и не регистрируется в лог-файле. – ScaleOvenStove

+1

Интересно, что и этот ответ, и тот, который помечен как ответ, говорят почти одно и то же, но это было уменьшено до -1, в то время как тот, который помечен как ответ, сохраняется до +7 (по крайней мере, в настоящий момент я пишу это). Как ранее отмечал @dcp, [это] (http: //blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-roll-back-use-log-files-after-transaction-session-is-closed /) - хорошая статья, описывающая поведение отката TRUNCATE vs DELETE. –

43

Другого ключевым момент не упоминается в других ответах, что TRUNCATE TABLEбудет сбросить вашу идентичности исходных семян, в то время как DELETE FROM будет продолжать приращение, откуда она была прервана.

1

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

2

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

7

Еще одно отличие от перспективы безопасности заключается в том, что TRUNCATE требует привилегий ALTER в таблице, тогда как DELETE просто требует (барабанную ручку) разрешения DELETE для этой таблицы.

-1
$connection = $this->getEntityManager()->getConnection(); 
$connection->exec("Truncate TABLE <tablename>;"); 
+0

Не могли бы вы добавить некоторый контекст этого кода. – ppperry

0

Одна вещь, которая очень важна (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, и запросы, указанные выше, не будут застряли.

0

Другая разница между DELETE и TRUNCATE - это поведение, когда таблица повреждена.

Например:

DELETE FROM table_name; 

закончится с ошибкой:

Msg 3314, Level 21, State 3, Line 1

During undoing of a logged operation in database '...', an error occurred at log record ID(). Typically, the specific failure is logged previously as an error in the Windows Event Log service. Restore the database or file from a backup, or repair the database.

Msg 0, Level 20, State 0, Line 0

A severe error occurred on the current command. The results, if any, should be discarded.

Хотя TRUNCATE будет работать:

TRUNCATE TABLE table_name; 
-- Command(s) completed successfully. 
1

Наброски Удаление Vs Truncate в сервере SQL

Для полной статьи уродиться этой связи: Delete Vs Truncate in SQL Server

enter image description here

/*Truncate - Syntax*/ 
TRUNCATE TABLE table_name 

/*Delete - Syntax*/ 
DELETE FROM table_name 
WHERE some_condition 
Смежные вопросы