【问题标题】:Deleting rows from SQL Server increased the database size从 SQL Server 中删除行会增加数据库大小
【发布时间】:2016-05-04 10:00:49
【问题描述】:

我用 C# 编写了一些从数据库中删除记录的代码。这是包含在事务中的直接 SQL 删除代码。

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

我已经删除了数据库中 4 个表中的大约 400 万行。当我通过 Windows 资源管理器检查两个数据库的数据库备份大小时,大小已显着增加了大约三倍

  • 删除前:7GB
  • 删除后:28GB

我确认 MDFLDF 文件的大小都增加了。我还注意到一些不受删除影响的表的索引大小增加了。

删除后:

删除前:

我的目标是删除记录以减少数据库大小,但它反而增加了。你能告诉我为什么尺寸会增加吗?

编辑:

删除后:

  • 数据库大小: 61050.69 MB
  • 未分配空间: 9592.60 MB
  • 保留: 303512 KB
  • 数据: 207040 KB
  • index_size: 53024 KB
  • 未使用: 43448 KB

删除前:

  • 数据库大小: 10067.88 MB
  • 未分配空间: 16.69 MB
  • 保留: 7290176 KB
  • 数据: 2937656 KB
  • index_size: 4324848 KB
  • 未使用: 27672 KB

【问题讨论】:

  • 这更适合 dba.se,因为其原因(以及答案)与 C# 无关。任何在一个事务中删除大量行的DELETE 都会显示此问题。
  • 我希望 LDF 肯定会增加,而 MDF 至少会保持相同的大小但可能会增加。所以给我们一些数字。并使用sp_spaceused 计算出使用了多少空间以及保留了多少空间。通常,删除会释放 MDF 中的空间,但不会减少实际文件(因为它可能只需要再次增长)
  • @Nick.McDermaid 添加了sp_spaceused 数据,请参阅编辑
  • 我认为 sp_spaceused 拆分了日志和数据文件,但显然它没有。这个链接有一个方便的查询来查找数据和日志文件中的已用和可用空间。 dba.stackexchange.com/questions/59406/… 我怀疑你的数据文件中会有很多可用的未释放空间。此数据库中是否还有其他操作?

标签: sql-server database database-indexes database-optimization


【解决方案1】:

当您删除记录时,它会记录到事务日志。 所以通过删除这么多记录,事务日志的大小会增加。

所以我认为你必须清除/重置交易日志(谷歌它) 同时你已经重组了索引。

这两个步骤都是强制性的。

【讨论】:

    【解决方案2】:

    删除数据库中的行不会减少实际的数据库文件。

    删除行后需要压缩数据库。

    请看下面的链接 https://msdn.microsoft.com/en-us/library/ms190488(v=sql.90).aspx

    【讨论】:

      【解决方案3】:

      如果删除行的表存在聚集索引,则删除可能会保持表和索引的大小不变,甚至会增加它们。通常,表的主键基于聚集索引。

      在这种情况下,您应该使用命令重建索引

      alter index _indexName on _tableName rebuild
      

      其中 _indexName 是聚集索引的名称。

      另见https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多