Вот мой подробный ответ о разнице между 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 удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только освобождения страниц в журнал транзакций.
• Pages : после выполнения оператора DELETE таблица все еще может содержать пустые страницы.
TRUNCATE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы.
• Триггер : TRUNCATE не активирует триггеры удаления в таблице. Поэтому вы должны быть очень осторожны при использовании TRUNCATE. Никогда не следует использовать TRUNCATE, если в таблице определен триггер удаления, чтобы выполнить автоматическую очистку или запись в журнал действий при удалении строк.
• Столбец идентификаторов : С TRUNCATE, если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается на начальное значение, определенное для столбца. Если начальное число не было определено, используется значение по умолчанию 1.
УДАЛЕНИЕ не сбрасывает счетчик идентификаторов. Поэтому, если вы хотите сохранить счетчик идентификаторов, используйте вместо этого DELETE.
• Репликация : DELETE можно использовать для таблицы, используемой в репликации транзакций или репликации слиянием.
Хотя TRUNCATE нельзя использовать для таблиц, участвующих в репликации транзакций или репликации слиянием.
• Откат : оператор DELETE можно откатить.
TRUNCATE также можно откатить, если он заключен в блок TRANSACTION и сеанс не закрыт. После закрытия сессии вы не сможете откатить TRUNCATE.
• Ограничения : оператор DELETE может завершиться ошибкой, если он нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице, с ограничением FOREIGN KEY. Если команда DELETE удаляет несколько строк, и любая из удаленных строк нарушает триггер или ограничение, оператор отменяется, возвращается ошибка и строки не удаляются.
И если DELETE используется против View, этот View должен быть представлением с возможностью обновления.
TRUNCATE нельзя использовать для таблицы, используемой в индексированном представлении.
TRUNCATE нельзя использовать для таблицы, на которую ссылается ограничение FOREIGN KEY, если только таблица не имеет внешнего ключа, который ссылается на себя.