(Первоначально это был комментарий к ответу @ DaveE, но я поместил его в собственный ответ, потому что он стал длинным)
TRUNCATE это вошедший операция. В противном случае он не совместим с ACID. Тем не менее, различия между 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.