Мог кто-то давать мне быстрый обзор за и против использования следующих двух операторов:
TRUNCATE TABLE dbo.MyTable
по сравнению с
DELETE FROM dbo.MyTable
Кажется, что они оба делают то же самое, когда все сказано и сделано; но есть ли должны быть различия между двумя.
TRUNCATE
не генерирует никаких данных отката, что делает его молниеносным. Он просто освобождает страницы данных, используемые таблицей.
Однако, если вы находитесь в транзакции и хотите иметь возможность «отменить» это удаление, вам необходимо использовать УДАЛИТЬ ИЗ
, что дает возможность отката.
РЕДАКТИРОВАТЬ: Обратите внимание, что приведенное выше неверно для SQL Server (но применимо к Oracle). В SQL Server можно выполнить откат операции усечения, если вы находитесь внутри транзакции и транзакция не была зафиксирована. С точки зрения SQL Server, одно ключевое различие между DELETE FROM и TRUNCATE заключается в this : Оператор DELETE удаляет строки по одной и записывает запись в журнал транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает в журнал транзакций только освобожденные страницы. "
Другими словами, во время TRUNCATE ведется меньше журнала, потому что в журнале транзакций записывается только освобождение страниц, тогда как при DELETE FROM записывается удаление каждой строки. Это одна из причин, по которой TRUNCATE работает молниеносно.
Отметьте также из этой ссылки MSDN, что вы не можете усекать таблицы, на которые ссылаются ограничения внешнего ключа, участвуют в индексированном представлении или публикуются с использованием репликации транзакций или репликации слиянием.
РЕДАКТИРОВАТЬ 2: Другим ключевым моментом является то, что TRUNCATE TABLE сбросит вашу личность до начального значения, тогда как DELETE FROM продолжит увеличение с того места, где оно было остановлено. Ссылка: ответ Бена Робинсона.
TRUNCATE TABLE
не регистрирует транзакцию. Это означает, что он молниеносно подходит для больших столов. Обратной стороной является то, что операцию нельзя отменить.
DELETE FROM
регистрирует каждую удаляемую строку в журналах транзакций, поэтому операция занимает некоторое время и приводит к значительному увеличению количества журналов транзакций. Плюс в том, что при необходимости операцию можно отменить.
Еще один ключевой момент, не упомянутый в других ответах, заключается в том, что TRUNCATE TABLE
сбросит вашу идентификацию к начальному семени, тогда как DELETE FROM
будет продолжать увеличиваться с того места, на котором остановился.
truncate не ведет журналирования, delete - делает, поэтому, если у вас тонна записей, ваш журнал транзакций огромен