問題描述
RDS SQL Server在刪除變長列或者減小變長列的長度后,表的大小不會自動減小。其中變長列包括的字段類型有varchar
、nvarchar
、varchar(max)
、nvarchar(max)
、varbinary
、text
、ntext
、image
、sql_variant
、varbinary(max)
、xml
。
問題原因
因為空間是不會自動回收的,每個記錄都占了一個位置。即使刪除了數據,位置也會空在那里,下次插入記錄的時候,會優先選這些空的槽位。
解決方法
您可以考慮定時重建聚集索引。另外,即使收縮了表的空間,數據庫的數據文件大小也不會變小。如果需要收縮一個SQL Server的數據文件,必須使用DBCC SHRINKDATABASE
命令收縮指定數據庫的指定數據或日志文件大小,或者使用DBCC SHRINKFILE
命令收縮當前數據庫的指定數據或日志文件大小。MySQL表的空間是獨立的一個文件,所以收縮MySQL的大表,可以收縮整體數據庫的大小,但是SQL Server所有的表都是在數據庫的文件里,只有收縮文件才可以縮小空間。
因為MySQL表的空間是獨立的一個文件,如果收縮MySQL的大表,會相應收縮整體數據庫的大小。又由于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
- 方法二:重建索引。
文檔內容是否對您有幫助?