删除变长列字段后使用DBCC CLEANTABLE回收空间

简介:

SQL Server在删除变长列或者减小变长列的长度后,表的大小不会响应自动减小,除非DBA重建索引或者reorganized索引。变长列包括varchar,nvarchar, varchar(max), nvarchar(max), varbinary, varbinary(max), text, ntext,image, sql_variant,xml

 

SQL Server提供了一个DBCCCLEANTABLE的命令可以回收表或索引视图中已删除的可变长度列的空间。

 

下面我们做个测试:

 

1. --创建测试表

CREATE TABLE testfreespace

( column1 INT

,column2 CHAR(20)

,column3 VARCHAR(8000))

 

2. --插入数据

DECLARE @count INT;

SET @count = 0;

WHILE @count < 3000

BEGIN

SELECT

@count = @count + 1;

INSERT into testfreespaceVALUES( @count,'test row # '+CAST(@countASVARCHAR(10)),REPLICATE('TestData', 3000)) ;

END

 

3. --查看使用空间使用情况

SELECT

alloc_unit_type_desc,

page_count,

avg_page_space_used_in_percent,

record_count

FROM sys.dm_db_index_physical_stats(DB_ID('FNDBLogtest'),OBJECT_ID(N'Testfreespace'),NULL,NULL,'Detailed')

结果:

alloc_unit_type_desc page_count avg_page_space_used_in_percent record_count

-------------------------------------------------------------------------------- ------------------------------ --------------------

IN_ROW_DATA 3000 99.2710649864097 3000

 

(1 row(s) affected)

 

4. --删除变长列Column3

ALTER TABLETestfreespaceDROPCOLUMNColumn3

 

5. 使用3脚本查询看到avg_page_space_used_in_percent仍然是99.2710649864097 没有改变。

 

 

6. --执行DBCC CLEANTABLE

DBCC CLEANTABLE(FNDBLogTest,"Testfreespace")

 

7. 再次运行3脚本看到下面的结果:

 

alloc_unit_type_desc page_count avg_page_space_used_in_percentrecord_count

-------------------------------------------------------------------------------- ------------------------------ --------------------

IN_ROW_DATA 3000 0.382999752903385 3000

 

(1 row(s) affected)

 

 

可以看到现在avg_page_space_used_in_percent已经变了,证明空间已经释放。

 

更多信息参考:DBCCCLEANTABLE (Transact-SQL)http://msdn.microsoft.com/zh-cn/library/ms174418.aspx

本文转自 lzf328 51CTO博客,原文链接:

http://blog.51cto.com/lzf328/960310


相关文章
|
SQL 索引 Perl
truncate表,会将统计信息清除么?
看见微信群有位朋友问: truncate表,会将统计信息清除么? 有些朋友回复, 数据字典信息都没有了,统计信息就清除了,所以是没有统计信息的。 做个实验,跟踪一下truncate,应该比较清楚。
1265 0
|
数据库 索引
表、索引、表空间的回收
说明:数据库运行一段时间后,需要对数据库进行归档的操作; 数据库归档完成后,需要对表和索引进行收缩才能真正的提高整个系统的运行效率。 如果需要对数据库的表空间进行回收,还需要对数据文件进行rsize的操作; 详细操作步骤: 一、表和索引的收缩 1、查看...
748 0
|
SQL Oracle 关系型数据库
检查oracle表和索引可回收空间!!
不错的文章~~工作中很常用。 记录学习。 交流群127591054 原帖地址:http://www.
1242 0
|
数据库
查询数据库中表的行数及空间占用情况
--查询数据库中所有的表名及行数 SELECT a.name , b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.
1000 0
|
SQL Oracle 关系型数据库
查询表空间状态,创建表空间,让表空间的大小自动扩展,删除表空间
通过select * from DBA_DATA_FILES可以看到现在数据库中的表空间和状态。 其中AUTOEXTENSIBLE为是否自动扩展。 如果需要关闭自动扩展: alter database datafile 'xxx.dbf' autoextend off; 如果需要打开自动扩展 alter database datafile 'xxx.dbf' autoexten
2024 0
|
SQL 关系型数据库 Oracle
|
关系型数据库 MySQL 索引
|
SQL 存储 关系型数据库
itpub坛友问题--基于普通表或分区表创建索引,会占用临时表空间及何时回收临时表空间
个人简介: 8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。        服务过的客户:           中国电信      ...
854 0

热门文章

最新文章