我有一个关于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 

默认情况下,您的主键是您的聚集索引(除非您另有指定)。

马克

其他提示

即使使用“收缩数据库”,您也没有清理或压缩任何数据。

DBCC CLEANTABLE

  

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

然而,简单索引重建 < em>如果有聚集索引也应该这样做

ALTER INDEX ALL ON dbo.Mytable REBUILD

Tony Rogerson的一个有效例子

我知道我没有按你的要求回答你的问题,但你是否考虑将一些数据存档到历史表中,并使用较少的行?

大多数时候,您可能一眼就认为您需要所有数据,但实际上坐下来检查时,有些情况并非如此。或者至少我以前经历过这种情况。

我在这里遇到了类似的问题 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

当然,身份,索引等事情变得更加复杂......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top