我有一个Sql Server 2005数据库,其中包含许多占用大量空间(总计超过10 GB)的表,并且这些表中没有行。我可以通过右键单击属性(数据空间和行计数项)来查看空间和行数。
有什么想法吗?
答案 0 :(得分:2)
删除数据时,事务日志和数据文件不会缩小,假设您将再次使用它。如果您确实需要,可以使用DBCC SHRINKFILE
和/或DBCC SHRINKDATABASE
来回收空间。
答案 1 :(得分:1)
删除记录时,不会从数据库中删除可用空间。相反,它会留在那里,并在以后添加新记录时重复使用。
您可以手动收缩数据库,也可以将其设置为定期自动收缩。
手动萎缩:
自动缩小:
快速浏览文档只会说“自动收缩”会“定期”发生。我没有注意到那段时期的提及。
缩小数据库时,默认情况下,仅删除文件末尾的空白页。因此,如果您的数据库有大量空白页面后跟一个已用过的页面,那么它不会收缩太多。当通过GUI缩小它时,缩小对话框中有一个选项“在释放未使用的空间之前重新组织文件”。选中此选项将导致在截断尾随空白区域之前将使用过的页面移动到文件的前面,但也会花费更长的时间。
答案 2 :(得分:0)
BradC在https://serverfault.com/questions/89814/sql-server-huge-tables-with-no-rows
重建表上的所有索引,包括聚簇索引。来自Books Online:
重建索引丢弃和 重新创建索引。这删除 碎片,回收磁盘空间 基于的压缩页面 指定的或现有的填充因子 设置,并重新排序索引行 在连续的页面中。
类似的东西:
ALTER INDEX ALL ON [lc_db_user].[JMS_MESSAGES] REBUILD
DBCC SHRINKDATABASE或(更优选)DBCC SHRINKFILE仅在空间实际从表本身中释放时才会执行某些操作。另外请确保您熟悉issues associated with shrinking database files。执行摘要:永远不要使用自动收缩,只在必要时收缩文件,并始终使用完整的重新索引来对您刚刚分散的所有索引进行碎片整理。