Удаление всех строк с помощью инструкции TRUNCATE TABLE

Инструкция TRUNCATE TABLE представляет собой быстрый и эффективный метод удаления всех строк в таблице. Инструкция TRUNCATE TABLE похожа на инструкцию DELETE без предложения WHERE. Однако инструкция TRUNCATE TABLE быстрее, и она использует меньшее количество системных ресурсов и ресурсов, связанных с журналом транзакций.

По сравнению с инструкцией DELETE инструкция TRUNCATE TABLE обладает следующими преимуществами.

  • Для журнала транзакций используется меньшее количество памяти.

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

  • Обычно используется меньшее количество блокировок.

    Если инструкция DELETE выполняется с блокировкой строк, для удаления блокируется каждая строка таблицы. Инструкция TRUNCATE TABLE всегда блокирует таблицу и страницу, но не каждую строку.

  • Все без исключения нулевые страницы остаются в таблице.

    После выполнения инструкции DELETE в таблице могут все еще оставаться пустые страницы. Например, пустые страницы в куче не могут быть освобождены, по крайней мере, без монопольной блокировки таблицы (LCK_M_X). Если операция удаления не использует блокировку таблицы, таблица (куча) будет содержать множество пустых страниц. Для индексов операция удаления может оставлять пустые страницы, хотя эти страницы будут быстро освобождены в процессе фоновой очистки.

Так же, как и при выполнении инструкции DELETE, определение таблицы, очищенной с помощью операции TRUNCATE TABLE, остается в базе данных вместе со своими индексами и другими связанными объектами. Если таблица содержит столбец идентификаторов, счетчик этого столбца сбрасывается до начального значения, определенного для этого столбца. Если начальное значение не задано, используется значение по умолчанию, равное 1. Чтобы сохранить столбец идентификаторов, используйте инструкцию DELETE.

Усечение больших таблиц

В Microsoft SQL Server впервые появилась возможность удалять или усекать таблицы, имеющие более 128 экстентов, не удерживая одновременные блокировки для всех экстентов, предназначенных для удаления. Дополнительные сведения см. в разделе Удаление и повторная сборка больших объектов.

Примеры

В следующем примере удаляются все данные из таблицы JobCandidate. Для сравнения результатов до и после инструкции TRUNCATE TABLE включаются инструкции SELECT.

USE AdventureWorks2008R2;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO