【发布时间】:2016-05-04 10:00:49
【问题描述】:
我用 C# 编写了一些从数据库中删除记录的代码。这是包含在事务中的直接 SQL 删除代码。
using (SqlTransaction trans = conn.BeginTransaction()) {
//some delete code
trans.Commit();
}
我已经删除了数据库中 4 个表中的大约 400 万行。当我通过 Windows 资源管理器检查两个数据库的数据库备份大小时,大小已显着增加了大约三倍
- 删除前:7GB
- 删除后:28GB
我确认 MDF 和 LDF 文件的大小都增加了。我还注意到一些不受删除影响的表的索引大小增加了。
删除后:
删除前:
我的目标是删除记录以减少数据库大小,但它反而增加了。你能告诉我为什么尺寸会增加吗?
编辑:
删除后:
- 数据库大小: 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