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

时间:2008-09-05 18:06:47

标签: sql-server

我有一些非常大的SQL数据库。经过检查,我发现某些表中有一堆未使用的空间。我没有做很多物理删除,所以我不认为它只是删除了记录。 DBCC SHRINK不会使文件变小。但是,如果我将表转储到一个新的空数据库,则大小会下降大约80%。而不是我在当前数据库中的这个表中的7gb,我最终在新数据库中大约1.5gb。它好像sql server分配了太多的内存。以前遇到过这个人吗?我希望能够通过删除未使用的已分配空间来缩小表,而无需创建一个全新的数据库。

其他信息:

使用完全恢复模型。我会尝试重建索引,我想它已经有一段时间了。 ldf每天都会使用一些古怪的存储过程来缩小它们。

6 个答案:

答案 0 :(得分:2)

我发现如果你不小心备份你的transistion日志文件(LDF),你会得到类似这种行为的东西。我不能强调具有良好的备用“卫生”的重要性。如果出现问题,它不仅会保存您的培根,而且还有助于维护一个非常紧凑的数据库。

答案 1 :(得分:1)

  

我没有做很多物理删除

表的更新怎么样,碎片级别是什么。运行DBCC SHOWCONTIG,然后重建索引,如果它是高度分段的。之后,使用TRUNCATE_ONLY执行BACKUP LOG,然后执行SHRINK命令

答案 2 :(得分:0)

在选项中,您可以指定想要增加的数量。默认情况下,我认为它是10%,所以考虑到200MB的数据库,当你填满你的最后一页时,它将分配另外20MB的页面空间。在7GB时,它将分配700MB。

我不知道在创建数据库后你可以在哪里修改它,但我知道在你创建数据库时它有它。一点谷歌工作很可能会向你揭示答案。

注意:我的答案不是如何修复它,而是如何预防/解释为什么你可能会看到所有这些未分配的空间。

答案 3 :(得分:0)

这在过去对我有用

USE [DBNAME]
GO

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

GO

答案 4 :(得分:0)

我有一次类似的问题,我相信如果给定的表上没有聚集索引,我发现reindex / shrinking没有回收所有未使用的空间。

答案 5 :(得分:0)

表可能是为索引打开填充而构建的。人们构建填充索引的原因是为了防止页面拆分。

右键单击SQL Manager中的表并选择SCRIPT TABLE。然后看看是否PAD_INDEX=OFF。如果正在使用PAD_INDEX,那可能就是表占用空间的地方。