(Спочатку це був коментар до відповіді @ DaveE, але я вклав це у свою відповідь, тому що він отримав тривалий час)
TRUNCATE
- це зареєстрована операція. Це повинно бути інакше, що це не сумісне з кислотами. Однак різниці між TRUNCATE
та DELETE
:
- Використання простору журналу:
TRUNCATE
звільнено лише сторінки / розширення *, а DELETE
окремі рядки - журнали.
- Використання блокування:
TRUNCATE
зазвичай використовується менше блоків, оскільки воно займає блокування таблиці та блокування сторінок, на відміну від DELETE
використання блокування рядків **.
IDENTITY
послідовності: TRUNCATE
скидає послідовність ідентичності на таблиці, якщо вона присутня.
(* Обсяг = 8 сторінок. TRUNCATE
Буде входити / видаляти розширення, якщо вони всі з тієї однієї таблиці, інакше він увійде / видалить сторінки зі змішаних розширень.
** Одним із побічних ефектів цього є те, що DELETE FROM TABLE
потенційно можна залишити порожні сторінки, виділені в таблиці, залежно від того, може операція отримати ексклюзивне блокування таблиці чи ні.)
Отже (назад до початкового питання), TRUNCATE TABLE
безумовно, краще, ніж DELETE FROM TABLE
якщо ви спорожняєте таблицю, але хочете зберегти структуру (Примітка: TRUNCATE
не можна використовувати в таблиці, на яку посилається іноземний ключ з іншої таблиці).
Як зазначається в коментарі @ Tullo, також перевірте модель відновлення вашої бази даних - якщо вона повна, то вам потрібно або почати робити резервні копії журналу, або змінити модель відновлення на просту. Після того, як ви зробите будь-яку з цих, ви, ймовірно, захочете зменшити файл журналу як разову операцію (NB: лише файл журналу ), щоб повернути все це вільне місце.
Нарешті, ще одна річ, яку слід пам’ятати - таблична статистика. запустити UPDATE STATISTICS <TABLENAME>' after
TRUNCATE /
DELETE`, щоб оптимізатор запитів не залучався старою статистикою.
TRUNCATE TABLE
замість цьогоDELETE FROM
.