Article / 文章中心

阿里云数据库RDS SQL Server如何回收表空间?

发布时间:2020-04-20 点击数:968

问题描述

RDS SQL Server在删除变长列或者减小变长列的长度后,表的大小不会自动减小。其中变长列包括的字段类型有varchar、nvarchar、varchar(max)、nvarchar(max)、varbinary、text、ntext、image、sql_variant、varbinary(max)、xml。

问题原因

空间是不会自动回收的,每个记录都占了一个位置。即使删除了数据,位置也会空在那里,下次插入记录的时候,会优先选这些空的槽位。

解决方案

阿里云提醒您:

•如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

•如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

•如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

您可以考虑定时重建聚集索引。另外,即使收缩了表的空间,数据库的数据文件大小不会变小。要收缩 一个SQL Server的数据文件,必须用DBCC SHRINKDATABASE语句收缩指定数据库的指定数据或日志文件大小,或者用DBCC SHRINKFILE语句收缩当前数据库的指定数据或日志文件大小。MySQL表的空间是独立的一个文件,所以收缩MySQL的大表,可以收缩整体数据库的大小,但是SQL Server所有的表都是在数据库的文件里,只有收缩文件才可以缩小空间。本文主要介绍如下两种方法。

•SQL Server提供了一个DBCC CLEANTABLE语句,可以回收表或索引视图中已删除可变长度列的空间。语法如下所示。

DBCC CLEANTABLE  

(  

    { database_name | database_id | 0 }  

    , { table_name | table_id | view_name | view_id }  

    [ , batch_size ]  

)  

[ WITH NO_INFOMSGS ]

   提示:

   ▫database_name | database_id | 0:要清除的表所在的数据库。如果指定0,则使用当前数据库。

   ▫table_name | table_id | view_name | view_id:要清除的表或索引视图。

   ▫batch_size:每个事务处理的行数。如果未指定,或指定为0,则该语句将在一个事务中处理整个表。

   ▫WITH NO_INFOMSGS:取消显示所有信息性消息。

具体示例如下所示。

DBCC CLEANTABLE (testDB,'testTable', 0)  

WITH NO_INFOMSGS;  

GO

•重建索引或者reorganized索引。

适用于

•云数据库 RDS SQL Server 版

阿里云代理商  阿里云分销商