为什么sp_spaceused在表为空时显示非零结果?

时间:2013-09-16 09:53:47

标签: sql tsql sql-server-2012

我有以下表格定义:

CREATE TABLE [dbo].[FillFactor](
    [FillFactorId] [int] NOT NULL,
    [Title] [varchar](50) NOT NULL
) ON [PRIMARY]

GO

表没有任何主键或索引。首先我用虚拟数据填充表,然后执行过程sp_spaceused,其中我得到一行包含保留数据,索引数据等的一些值。

但是当我从表中删除所有行并执行sp_spaceused过程时,我得到了以下结果:

enter image description here

为什么值> 0?删除数据时存储空间发生了什么变化?谁能解释一下这种情况呢?

谢谢!

2 个答案:

答案 0 :(得分:4)

当您从数据库中删除行时,您将清空分配给表的页,在堆中(没有聚簇索引的表)没有可以从表中取消分配页面而没有独占表锁,如果您执行了如下所示的删除操作,您将在sp_spaceused结果中看到不同的结果:

DELETE FROM [dbo].[FillFactor] 
WITH
(
TABLOCK
)

你仍然可以在带有索引的表中挂起空页,但这些通常会被ghost清理过程很快删除。

truncate操作会立即从表中释放页面而不是删除行,从而清空页面,因此在运行该命令后,您将看到sp_spaceused的全部为零。

答案 1 :(得分:0)

但是如果你对表进行TRUNCATE,那么你将再次获得零。您正在查看表填充的页面的开销,但是您已使用DELETE语句清空。