在我们的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倍
答案 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等管理页面)和事务日志文件组成。