堆(heap)结构时,有一种情形导致表(table)的空间持续增长,却不能收缩。
一、搭建测试环境
1. 创建数据库
CREATE DATABASE [db01] ON PRIMARY ( NAME = N'db01', FILENAME = N'C:\sqldata\db01.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'db01_log', FILENAME = N'C:\sqldata\db01_log.ldf' , SIZE = 1024KB , FILEGROWTH = 1024KB) ALTER DATABASE [db01] SET RECOVERY SIMPLE |
2. 创建表
USE db01 CREATE TABLE table1 (UserID int,pwd char(20),OtherInfo char(4100),modifydate datetime) |
3. 添加记录
DECLARE @i int SET @i=0 WHILE @i<1000 BEGIN INSERT INTO table1 SELECT @i, cast(floor(rand()*100000) as varchar(20)), cast(floor(rand()*100000) as char(4100)), GETDATE() SET @i=@i+1 END |
4. 删除记录,只保留最后一条记录
DELETE table1 WHERE UserID < 999 |
5. 尝试收缩数据文件
DBCC SHRINKFILE (N'db01' , 0, TRUNCATEONLY) |
6. 查看数据库的磁盘使用空间
此时,mdf文件为11MB。而这个数据库最初创建时为5MB。
二、回收空间的2种方法
1. 创建聚集索引,再收缩
CREATE CLUSTERED INDEX IX_table1_UserID ON table1 (UserID) DBCC SHRINKFILE (N'db01' , 0, TRUNCATEONLY) |
2. 重建表,再收缩
ALTER TABLE table1 REBUILD DBCC SHRINKFILE (N'db01' , 0, TRUNCATEONLY) |