如何减少从数据类型更改的SQL Server表的大小
-
03-07-2019 - |
题
我有一个关于SQL Server 2005的表,大小约为4GB。
(约1700万条记录)
我将其中一个字段从数据类型 char(30)
更改为 char(60)
(共有25个字段,其中大多数是 char( 10)
所以char空间的数量加起来大约为300)
这导致表格大小加倍(超过9gb)
然后我将 char(60)
更改为 varchar(60)
,然后运行一个函数来从数据中删除额外的空格(以减少平均值)字段中的数据长度约为15)
这并没有减少表格大小。收缩数据库也无济于事。
实际上没有重新创建表格结构并复制数据(这是1700万条记录!)是不是有一种不那么激烈的方式让尺寸再次缩小?
解决方案
很明显你没有得到任何空间! : - )
当您将文本字段更改为CHAR(60)时,它们都填充了空格容量。所以你的所有字段现在都是60个字符。
将其更改回VARCHAR(60)无济于事 - 这些字段仍然是60个字符长....
您真正需要做的是在所有字段上运行TRIM函数以将其缩减回修剪长度,然后缩小数据库。
完成后,您需要重新编写聚簇索引,以便回收一些浪费的空间。聚集索引实际上是数据存在的位置 - 您可以像这样重建它:
ALTER INDEX IndexName ON YourTable REBUILD
默认情况下,您的主键是您的聚集索引(除非您另有指定)。
马克
其他提示
即使使用“收缩数据库”,您也没有清理或压缩任何数据。
从表或索引视图中删除的可变长度列中回收空间。
然而,简单索引重建 < em>如果有聚集索引也应该这样做
ALTER INDEX ALL ON dbo.Mytable REBUILD
我知道我没有按你的要求回答你的问题,但你是否考虑将一些数据存档到历史表中,并使用较少的行?
大多数时候,您可能一眼就认为您需要所有数据,但实际上坐下来检查时,有些情况并非如此。或者至少我以前经历过这种情况。
我在这里遇到了类似的问题 SQL Server,将NTEXT转换为NVARCHAR(MAX)与将ntext更改为nvarchar(max)相关。
我必须做一个 UPDATE MyTable SET MyValue = MyValue
,以便让它很好地调整大小。
这显然需要相当长的时间来处理大量记录。关于如何做得更好,有很多建议。它们的关键一个是一个临时标志,表示它是否已经完成,然后在一个循环中一次更新几千个,直到完成所有操作。这意味着我有“一些”控制它在做多少。
另一方面,如果你真的想尽可能地缩小数据库,那么如果你将恢复模型简化为简单,缩小事务日志,重新组织页面中的所有数据,然后设置它,它会有所帮助回到完全恢复模型。但要小心,通常不建议缩小数据库,如果减少实时数据库的恢复模型,则要求出错。
或者,您可以进行全表重建,以确保没有任何额外数据在任何地方停留:
CREATE TABLE tmp_table(<column definitions>);
GO
INSERT INTO tmp_table(<columns>) SELECT <columns> FROM <table>;
GO
DROP TABLE <table>;
GO
EXEC sp_rename N'tmp_table', N'<table>';
GO
当然,身份,索引等事情变得更加复杂......