SQL Server未使用,但已分配表空间

SQL Server未使用,但已分配表空间

SQL Server unused, but allocated table space

我有越来越大的ms sql数据库。 经检查,我发现某些表中有一堆未使用的空间。 我没有进行很多物理删除,因此我认为它只是删除的记录。 DBCC SHRINK不会缩小文件。 但是,如果我将表转储到新的空数据库中,则大小将减少约80%。 最终,我在新数据库中获得的内存约为1.5gb,而不是当前数据库中此表中的7gb。 好像sql server正在分配太多内存。 有人遇到过吗? 我希望能够通过删除未使用的分配空间来缩小表,而不必创建一个全新的数据库。

附加信息:

使用完整恢复模型。 我会尝试重建索引,我认为已经有一段时间了。 ldf每天都会使用一些古怪的存储过程将其缩减。


我发现,如果您不小心备份跨记录日志文件(LDF),将会得到类似的行为。我不能过分强调拥有良好备份"卫生"的重要性。如果出现问题,它不仅可以节省培根,而且我还将帮助维护一个良好的紧密数据库。


I don't do many physical deletes

表的更新如何,碎片级别是多少?运行DBCC SHOWCONTIG,如果索引高度分散,则重建索引。之后,执行带有TRUNCATE_ONLY的BACKUP LOG,然后执行SHRINK命令


该表可能是在为索引打开填充的情况下构建的。人们建立填充索引的原因是为了防止页面拆分。

右键单击SQL Manager中的表,然后选择"脚本表"。然后查看是否为PAD_INDEX=OFF。如果使用PAD_INDEX,则可能是表占用空间的地方。


我曾经有一个类似的问题,我相信我发现如果给定表上没有聚集索引,则重新索引/收缩不会回收所有未使用的空间。


过去这对我有用

1
2
3
4
5
6
USE [DBNAME]
GO

DBCC SHRINKFILE (N'FILENAME' , 0, TRUNCATEONLY)

GO

在选项中,您可以指定增长幅度。默认情况下,我认为它是10%,所以给定一个200MB的数据库,当您填充最后一页时,它将分配另外20MB的页面空间。在7GB时,它将分配700MB。

我不知道在创建数据库后可以在哪里修改它,但是我知道在创建数据库时可以在其中修改它。一点点Google工作将很可能向您揭示答案。

注意:我的回答不是如何解决,而是也许如何防止/解释为什么您可能会看到所有这些未分配的空间。


推荐阅读