首页 > 解决方案 > SQL Server - 删除表中的所有行(不截断)但收缩后空间没有减少

问题描述

我正在对我们的 UAT 环境进行一些测试,所以我删除了一个大表中的所有行。然后我对受影响的文件名进行了缩小。

但是,即使有 0 行,我仍然看到表占用的原始大小 (60gb)。进一步看,有一个 NULL 索引(我认为这意味着非索引,因此使用 PK)为该表占用 30gb 和 30gb 的“可用空间”。

如何将索引空间和“可用空间”都恢复为 0gb?

谢谢!艾伦

标签: sql-serversql-server-2012shrink

解决方案


如果您的表是堆,则删除行时不会回收空间。您必须创建一个聚集索引来回收空间(然后删除聚集索引以在最后有一个堆)

create table dbo.myheap
(
id int identity,
col char(500) not null
);
go


insert into dbo.myheap(col)
select top (10000) a.name
from master.dbo.spt_values as a
cross join master.dbo.spt_values as b;
go


exec sp_spaceused 'dbo.myheap' --myheap 10000       5384 KB 5336 KB 8 KB    40 KB
go

--delete all rows
delete dbo.myheap;
go

--space is not freed
exec sp_spaceused 'dbo.myheap' --myheap 0           5384 KB 5336 KB 8 KB    40 KB
go


--from heap to clustered
create clustered index clxheaptocluster on dbo.myheap(id);
go

exec sp_spaceused 'dbo.myheap' --myheap 0           0 KB    0 KB    0 KB    0 KB
go

--cleanup
drop table dbo.myheap
go

对于聚集表,重建聚集索引(或 ALL):

ALTER INDEX ALL /*clusteredindexname*/ ON dbo.myclusteredtable REBUILD;

推荐阅读