我有以下表格定义:
CREATE TABLE [dbo].[FillFactor](
[FillFactorId] [int] NOT NULL,
[Title] [varchar](50) NOT NULL
) ON [PRIMARY]
GO
表没有任何主键或索引。首先我用虚拟数据填充表,然后执行过程sp_spaceused
,其中我得到一行包含保留数据,索引数据等的一些值。
但是当我从表中删除所有行并执行sp_spaceused
过程时,我得到了以下结果:
为什么值> 0?删除数据时存储空间发生了什么变化?谁能解释一下这种情况呢?
谢谢!
答案 0 :(得分:4)
当您从数据库中删除行时,您将清空分配给表的页,在堆中(没有聚簇索引的表)没有可以从表中取消分配页面而没有独占表锁,如果您执行了如下所示的删除操作,您将在sp_spaceused结果中看到不同的结果:
DELETE FROM [dbo].[FillFactor]
WITH
(
TABLOCK
)
你仍然可以在带有索引的表中挂起空页,但这些通常会被ghost清理过程很快删除。
truncate操作会立即从表中释放页面而不是删除行,从而清空页面,因此在运行该命令后,您将看到sp_spaceused的全部为零。
答案 1 :(得分:0)
但是如果你对表进行TRUNCATE,那么你将再次获得零。您正在查看表填充的页面的开销,但是您已使用DELETE语句清空。