堆(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)