Truncate table (transact-sql)

У порівнянні з інструкцією 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 існує можливість видаляти або усікати таблиці, які мають більше 128 екстентів, що не утримуючи одночасні блокування для всіх екстентів, призначених для видалення. Додаткові відомості див. У розділі Видалення і повторна збірка великих об'єктів.

Мінімально необхідне дозволом є ALTER table_name. Дозволи за замовчуванням для інструкції TRUNCATE TABLE поширюються на власника таблиці, членів зумовленої ролі сервера sysadmin, а також визначених ролей бази даних db_owner і db_ddladmin. Ці дозволи не передаються. Проте інструкцію TRUNCATE TABLE можна вбудувати в модуль, наприклад в збережену процедуру, і надати відповідні дозволи цього модулю за допомогою пропозиції EXECUTE AS. Додаткові відомості див. У розділі Використання інструкції EXECUTE AS для створення власного набору дозволів.