1

在我们的 SQL Server 数据库属性中,我们的数据库大小显示为 67069.081 MB,但是当我们运行此脚本时

Create Table #Temp(Name sysname, rows int, reserved varchar(100), data varchar(100),    index_size varchar(100), unused varchar(100))

exec sp_msforeachtable 'Insert Into #Temp Exec sp_spaceused ''?'', ''true''' 

Select  SUM(CONVERT(INT,REPLACE(data, ' KB', ''))) as d From #Temp

Drop Table #Temp

结果是 7650088 KB 接近 7470.7890625 MB

67069.081,比 7470.7890625 大 8.97750966316 倍

4

2 回答 2

1

SQL Server 数据库属性返回数据和日志文件的大小。sp_spaceused(与没有任何参数的情况相同。)sp_spaceused table返回表的大小(即数据文件的一部分)-它从不考虑事务日志-这是您看到的差异中缺少的部分。

作为背景 - 数据库由数据文件(表、索引、管理页面,如 GAM、SGAM)和事务日志文件组成。

于 2013-11-01T11:16:50.613 回答
0

这些表没有聚集索引,因此您不能在逻辑上完全对它们进行碎片整理(重建索引)。也就是说,索引是碎片整理的,而不是实际数据。

此外,堆(没有聚集索引的表)中的 DELETE 不会释放空间。有关更多信息,请参见http://msdn.microsoft.com/en-us/library/ms189245(v=sql.105).aspx

解决方案?

Add clustered indexes for a long term fix (subject to regular index maintenance)
Run DBCC SHRINKFILE with NOTRUNCATE to compact data.
于 2013-11-01T09:09:44.680 回答