(Спочатку це був коментар до відповіді @ 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>' afterTRUNCATE /DELETE`, щоб оптимізатор запитів не залучався старою статистикою.
TRUNCATE TABLEзамість цьогоDELETE FROM.