Характеристика | DELETE TABLE | TRUNCATE TABLE |
---|---|---|
Синтаксис | DELETE FROM table_name [WHERE] | TRUNCATE TABLE table_name |
Условия WHERE | Поддерживается | Не поддерживается |
Журналирование | Полное (каждая строка) | Минимальное (только освобождение страниц) |
Триггеры | Вызываются | Не вызываются |
Производительность | Медленнее (построчное удаление) | Быстрее (освобождение всех данных) |
Ограничения внешнего ключа | Проверяются | Могут блокировать выполнение |
Идентификаторы (IDENTITY) | Не сбрасываются | Сбрасываются (начинает с начального значения) |
Требуемые права | DELETE на таблицу | Необходимы ALTER права на таблицу |
Удаляет строки из таблицы по одной, записывая каждое удаление в лог транзакций.
-- Удаление с условием
DELETE FROM Employees
WHERE Department = 'HR';
-- Удаление всех строк
DELETE FROM TemporaryData;
Особенности:
Быстро освобождает все данные из таблицы, деаллоцируя страницы данных.
-- Очистка всей таблицы
TRUNCATE TABLE SessionLogs;
Особенности:
Для таблицы с 1 млн строк:
-- Пример измерения производительности
DECLARE @start DATETIME = GETDATE();
TRUNCATE TABLE LargeTable;
SELECT DATEDIFF(ms, @start, GETDATE()) AS TruncateTime;
SET @start = GETDATE();
DELETE FROM LargeTable;
SELECT DATEDIFF(ms, @start, GETDATE()) AS DeleteTime;
Нельзя использовать если:
Требует повышенных прав (ALTER TABLE)
Используйте DELETE когда:
Используйте TRUNCATE когда:
Если TRUNCATE недоступен из-за ограничений, но нужно быстро удалить данные:
-- Альтернатива с DROP/CREATE
BEGIN TRANSACTION;
DROP TABLE LargeTable;
CREATE TABLE LargeTable (...);
COMMIT;
Резюмируем: DELETE — гибкая, но медленная операция для выборочного удаления, тогда как TRUNCATE — быстрый способ очистки всей таблицы с определенными ограничениями. Выбор зависит от конкретных требований к производительности, безопасности и целостности данных.