TRUNCATE TABLE (Transact-SQL)

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

Значок ссылки на разделСоглашения о синтаксисе в Transact-SQL

Синтаксис

TRUNCATE TABLE 
    [ { database_name.[ schema_name ]. | schema_name . } ]
    table_name
[ ; ]

Аргументы

  • database_name
    Имя базы данных.
  • schema_name
    Имя схемы, которой принадлежит таблица.
  • table_name
    Имя таблицы, которая должна быть усечена, или таблицы, из которой удаляются все строки.

Замечания

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

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

Инструкция TRUNCATE TABLE удаляет все строки таблицы, но структура таблицы и ее столбцы, ограничения, индексы и т.п. сохраняются. Чтобы удалить не только данные таблицы, но и ее определение, следует использовать инструкцию DROP TABLE.

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

Ограничения

Инструкцию TRUNCATE TABLE нельзя использовать для таблиц, для которых выполняются следующие условия:

  • На таблицу ссылается ограничение FOREIGN KEY.
  • Таблица является частью индексированного представления.
  • Таблица опубликована с использованием репликации транзакций или репликации слиянием.

Для таблиц с какими-либо из этих характеристик следует использовать инструкцию DELETE.

Инструкция TRUNCATE TABLE не может активировать триггер, поскольку она не записывает в журнал удаление отдельных строк. Дополнительные сведения см. в разделе CREATE TRIGGER (Transact-SQL).

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

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

Разрешения

Минимально необходимым разрешением является ALTER table_name. Разрешения по умолчанию для инструкции TRUNCATE TABLE распространяются на владельца таблицы, членов фиксированной серверной роли sysadmin, а также фиксированных ролей базы данных db_owner и db_ddladmin. Эти разрешения не передаются. Тем не менее, инструкцию TRUNCATE TABLE можно встроить в модуль, например в хранимую процедуру, и предоставить соответствующие разрешения этому модулю с помощью предложения EXECUTE AS. Дополнительные сведения см. в разделе Использование инструкции EXECUTE AS для создания пользовательских наборов разрешений.

Примеры

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

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

См. также

Справочник

DELETE (Transact-SQL)
DROP TABLE (Transact-SQL)
IDENTITY (свойство) (Transact-SQL)

Другие ресурсы

Физическая архитектура журнала транзакций
Блокировка в компоненте Database Engine

Справка и поддержка

Получение помощи по SQL Server 2005