(Первоначально это был комментарий к ответу @ 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>' after
TRUNCATE /
DELETE`, чтобы оптимизатор запросов не сработал из-за старой статистики.
TRUNCATE TABLE
вместоDELETE FROM
.