sql-server - SQL Server - 删除表中的所有行(不截断)但收缩后空间没有减少
问题描述
我正在对我们的 UAT 环境进行一些测试,所以我删除了一个大表中的所有行。然后我对受影响的文件名进行了缩小。
但是,即使有 0 行,我仍然看到表占用的原始大小 (60gb)。进一步看,有一个 NULL 索引(我认为这意味着非索引,因此使用 PK)为该表占用 30gb 和 30gb 的“可用空间”。
如何将索引空间和“可用空间”都恢复为 0gb?
谢谢!艾伦
解决方案
如果您的表是堆,则删除行时不会回收空间。您必须创建一个聚集索引来回收空间(然后删除聚集索引以在最后有一个堆)
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;
推荐阅读
- api - 一次检索所有数据,而不是单独调用每个引用
- c# - 使用 CSVWriter 强制字符串长度
- python-3.x - 如何根据条件从python中的pandas数据框中选择列
- django - IntegrityError - 1048,不能为空 - 无法保存验证数据
- javascript - 香草JS动画?
- pine-script - 如何创建带有偏移量(stepshift)的 Hala 指标和基于该指标的策略以及一个多头头寸的简单策略脚本
- java - 在 Java 中重命名平面文件的替代方法
- javascript - 如何修复 Sass 加载程序的 ValidationError?
- php - 如何按日期对回复进行排序 - 最新回复首先显示
- javascript - 属性更改后 addEventListener 未更新