删除变长列字段后使用DBCC CLEANTABLE回收空间
2012-08-10 14:26
369 查看
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
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
相关文章推荐
- 删除变长列字段后使用DBCC CLEANTABLE回收空间
- C+指针开辟堆区内存空间并使用回收
- laravel 中 使用migrate对字段的删除 修改
- 使用批处理命令定期清理删除指定后缀文件,释放空间
- Linux大文件已删除,使用df查看已使用的空间并未减少
- 使用在线段收缩(ONLINE SEGMENT SHRINK)回收浪费的段空间
- sql server 创建table表 及添加各种约束 查看约束 删除约束 新增表的字段 规则及规则使用方法及应用到表中 时间函数的类型
- 回收带Lob字段表占用的空间
- df和du显示的磁盘空间使用情况不一致的原因及处理(文件删除后磁盘空间不释放)
- Hibernate的注释该如何使用? 属性 数据库中 字段 实体 级联删除
- myeclipse 删除不再使用的工作空间记录
- JavaScript基础 使用delete删除数组中一个元素的值 但是元素的所占的那个空间还在
- myeclipse 删除不再使用的工作空间记录
- 指针变量 如果指向的这块内存空间 已经被系统回收,程序员是不能使用这块内存
- Oracle删除大表并回收空间的过程
- 使用ArcCatalog删除某个字段的问题以及解决方法
- JavaScript基础 使用delete删除数组中一个元素的值 但是元素的所占的那个空间还在
- [每天一题]删除字符串中的重复字符(不要使用额外空间)
- new 出来的存储空间(如果不使用delete),系统会自动回收?
- Android studio 使用之删除整个项目(包括项目空间)