2

Я написал код на C#, который удаляет записи из базы данных. Это ваш простой код удаления SQL, заключенный в транзакцию.Удаление строк из SQL Server увеличило размер базы данных

using (SqlTransaction trans = conn.BeginTransaction()) { 
    //some delete code 
    trans.Commit(); 
} 

Я удалил около 4 миллионов строк по 4 таблицам в моей базе данных. Когда я проверил размер резервной копии базы данных обоих блоков данных с помощью Windows Explorer, размер резко увеличился примерно три раза

  • Перед удалением: 7GB
  • После удаления: 28GB

Я подтвердил что и размеры MDF, так и файлы LDF увеличены. Я также заметил, что некоторые таблицы, которые не подвержены удалению, имеют размер индекса.

После удаления:

enter image description here

Перед удалением:

enter image description here

Моя цель состоит в том, чтобы удалить записи, чтобы уменьшить размер базы данных, но он увеличился вместо этого. Можете ли вы сказать мне, почему размер увеличивается?

EDIT:

После удаления:

  • database_size: 61050,69 MB
  • нераспределенного пространства: 9592,60 MB
  • защищены: 303512 KB
  • данные: 207040 KB
  • index_size: 53024 KB
  • неиспользованными: 43448 KB

Перед удалением:

  • database_size: 100 67.88 MB
  • нераспределенное пространство: 16.69 MB
  • защищены: 7290176 KB
  • данные: 2937656 KB
  • index_size: 4324848 KB
  • неиспользованными: 27672 KB
+0

Это больше подходит для dba.se, так как причина этого (и ответ) не имеет ничего общего с C#. Любой 'DELETE', который удаляет много строк в одной транзакции, продемонстрирует эту проблему. –

+0

Я бы ожидал, что LDF определенно увеличится, и MDF, по крайней мере, останется того же размера, но, вероятно, увеличится. Поэтому дайте нам несколько цифр. И используйте 'sp_spaceused', чтобы определить, сколько места используется и сколько места зарезервировано. Обычно удаление освобождает пространство в MDF, но не уменьшает фактический файл (так как ему, вероятно, просто нужно будет его снова увеличить) –

+1

Возможный дубликат [Размер базы данных больше после удаления из таблицы] (http: // stackoverflow. com/questions/10865201/database-size-more-after-delete-from-table) – pmcilreavy

ответ

2

когда вы удаляете записи, то это войдите в журнал транзакций. , поэтому, удалив так много записей, размер журнала транзакций увеличивается.

Так что, я думаю, вам нужно очистить/сбросить журнал транзакций (Google) и в то же время у вас есть реорганизация индексов.

Оба этапа являются обязательными.

2

Удаление строк в базе данных не приведет к уменьшению фактического файла базы данных.

Необходимо удалить базу данных после удаления строки.

Пожалуйста, смотрите ниже ссылку https://msdn.microsoft.com/en-us/library/ms190488(v=sql.90).aspx

0

Если группируются индексы для таблиц, где были удалены строки, удаление может либо оставить размер таблиц и индексов без изменений или даже увеличить их. Часто первичный ключ для таблицы основан на кластерном индексе.

В этой ситуации, вы должны перестроить индексы с помощью команды

alter index _indexName on _tableName rebuild 

где _indexName это имя кластерного индекса.

смотри также https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql

Смежные вопросы