为什么SQL Server的属性显示数据库比实际更大?

时间:2013-11-01 09:00:40

标签: sql-server size

在我们的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倍

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

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

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