在SQL Server 2008 R2中,将列的varchar限制从512更改为最大值后,我注意到表的文件大小增加了一倍以上。 我没想到它会增加这么多,但是由于我在增加它,所以我认为这是有道理的。 因此,我尝试将其更改为更合理的2500的限制,只是发现表的大小再次超出文件大小的两倍(现在超过原始大小的4倍)。

唯一的索引是主键,这是我运行的脚本:

ALTER TABLE dbo.Notes
ALTER COLUMN [note] VARCHAR(MAX) NULL

我不了解什么?

#1楼 票数:1 已采纳

对于相同的数据集, varchar(max)不应比varchar(2500)占用更多空间。

也许SQL Server在更改表时需要临时空间? 尝试重建您的表(我假设您的主键是集群的):

alter index NameOfPrimaryKey on dbo.Notes rebuild

然后,再次检查表数据使用情况。

#2楼 票数:1

varchar(max)不存储在行内。 其存储在单独的位置。 原始行有一个指向varchar(max)数据位置的指针。 因此,如果将数据类型从varchar(512)更改为varchar(max),自然会期望表大小会增加。

如果要保留数据类型varchar(max)并避免将数据存储在单独的文件中,请尝试进行配置,以使一定长度的varchars与行保持一致。

上面所有的解释都不能解释表大小增加了4倍,因此请按照上面的建议重新构建主索引。

  ask by Ben Harrison translate from so

未解决问题?本站智能推荐:

7回复

更改列,添加默认约束

我有一张表,其中一列是日期时间类型的“日期”。 我们决定为该列添加一个默认约束 但这给了我错误: '.' 附近的语法不正确 有没有人在这里看到任何明显错误的东西,我错过了(除了为该列提供更好的名称之外)
14回复

改变列:null 到 not null

我有一个表,它有几个可为空的整数列。 由于多种原因,这是不可取的,因此我希望将所有空值更新为 0,然后将这些列设置为NOT NULL 。 除了将空值更改为0 ,还必须保留数据。 我正在寻找将列(称为ColumnA )更改为“ not null ”的特定 SQL 语法。 假设数据已更新为不包含空值。
3回复

当表取决于列时的ALTER COLUMN

我正在尝试更改列类型以增加其大小,但是SQL给我以下消息 当我运行此查询 我发现的有关此问题的问题是使您无法更新列的约束或统计信息,但是这里的表取决于我要编辑的列。 并且该列不用作FK或类似的东西。 如何更改列类型?
2回复

我可以更改临时表上主键的数据类型吗?

在SQL Server 2016 Express中,我最初使用主数据表创建了一个使用int数据类型的表。 现在,深入到项目中,我已经意识到我需要将该列作为字符串数据类型,但是当我尝试这样做时: 我明白了 是否可以在临时表上执行我想做的事情,还是需要重新制作表?
5回复

使用默认值将可空列更改为 NOT NULL

我今天遇到了一个旧表,它有一个名为“Created”的日期时间列,它允许空值。 现在,我想更改它,使其不为 NULL,并且还包含一个约束以添加默认值 (getdate())。 到目前为止,我已经有了以下脚本,只要我事先清理了所有空值,它就可以正常工作: 有没有办法在 ALTER 语句中也指定默
1回复

HSQLDB(HyperSQL):更改TEXT表中的列类型

对于CsvCruncher项目,我正在将CSV文件加载到HSQLDB中。 在创建表和加载时,我对列值一无所知。 为了加快SELECT的速度,我试图依靠此HSQLDB功能将列(加载后)转换为其他类型: “如果所有现有值都可以转换为新类型,而不会出现字符串截断或有效位数丢失的
1回复

更改用于视图的sql表中的列

我想更改一列以将其大小从[varchar](50)增加到[varchar](100) 。 上面的查询失败,因为视图vw_LegalCollection使用了LNAME列。 错误: 对象“ vw_LegalCollection”取决于列“ LName”。 ALTER TA
1回复

更改参与视图或规则的列

我正在使用一个名为giswater的工具来建模我们的下水道和暴雨网络。 该工具使用gui中的一些简单输入来构建数据库,其中一个是SRID。 几何列都是xy,我想让它们全部ZM知道。 当我运行alter table命令更新几何时,出现错误“无法更改参与视图或规则的列”无论如何要强制执行此更改