如何减少从数据类型更改的SQL Server表的大小

MrV*_*mes 20 sql-server types database-table

我有一个关于SQL Server 2005的表,大小约为4GB.

(约1700万条记录)

我将其中一个字段从数据类型更改char(30)char(60)(总共有25个字段,其中大部分都是char(10)如此,因此字符空间的数量加起来大约为300)

这导致表格尺寸翻倍(超过9gb)

然后我更改了char(60)to varchar(60)然后运行了一个函数来从数据中删除额外的空格(以便将字段中数据的平均长度减少到大约15)

这并没有减少表的大小.收缩数据库也没有帮助.

实际上没有重新创建表格结构并复制数据(这是1700万条记录!)是否有一种不那么激烈的方式让尺寸再次缩小?

gbn*_*gbn 25

即使使用"缩小数据库",您也没有清理或压缩任何数据.

DBCC清洁

从表或索引视图中删除的可变长度列中回收空间.

但是,如果存在聚簇索引,则还应执行简单的索引重建

ALTER INDEX ALL ON dbo.Mytable REBUILD
Run Code Online (Sandbox Code Playgroud)

Tony Rogerson的一个成功案例


mar*_*c_s 17

嗯,很明显你没有得到任何空间!:-)

当您将文本字段更改为CHAR(60)时,它们都填充了空格容量.所以你的所有字段现在都是60个字符.

将其更改回VARCHAR(60)将无济于事 - 这些字段仍然是60个字符长....

您真正需要做的是在所有字段上运行TRIM函数以将它们缩减回修剪长度,然后进行数据库收缩.

完成后,您需要重新生成聚簇索引,以便回收一些浪费的空间.聚集索引实际上是数据所在的位置 - 您可以像这样重建它:

ALTER INDEX IndexName ON YourTable REBUILD 
Run Code Online (Sandbox Code Playgroud)

默认情况下,主键是聚簇索引(除非您另行指定).