在大型表上增加VARCHAR列的大小时会出现问题吗?

时间:2011-09-22 10:46:02

标签: sql-server sql-server-2008 varchar alter-column

我正在使用SQL Server 2008,我需要在一个大约500k行的表上创建一个更大的VARCHAR字段,从(200到1200)。我需要知道的是,如果有任何问题我没有考虑过。

我将使用此TSQL语句:

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

我已经在数据的副本上试过了,这个声明没有我能看到的不良影响。

这样做有什么可能的问题我可能没有考虑过吗?

顺便说一句,该列未编入索引。

5 个答案:

答案 0 :(得分:56)

这只是元数据更改:它很快。

观察:明确指定NULL或NOT NULL以避免“其他”SET ANSI_xx设置不同时出现“意外”,例如由于某种原因在osql而不是SSMS中运行

答案 1 :(得分:10)

只想加我2美分,因为我用谷歌搜索了这个问题b / c我发现自己处于类似情况......

BE AWARE ,从varchar(xxx)更改为varchar(yyy)时确实是元数据更改,但更改为 varchar(max) 不是。因为varchar(max)值(也就是BLOB值 - 图像/文本等)以不同方式存储在磁盘上,而不是存储在表行中,而是存储在“行外”中。因此,服务器将在一张大桌子上疯狂,并在几分钟(几小时)内无响应。

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

PS。同样适用于nvarchar或课程。

答案 2 :(得分:4)

从Varchar(200)更改为Varchar(1200)应该没有问题,因为它只是元数据更改,并且由于SQL Server 2008截断了过多的空格,您应该看不出性能差异,所以总之应该没有问题做出改变。

答案 3 :(得分:0)

您应该避免将列转换为varchar(max)的另一个原因是您无法在varchar(max)列上创建索引。

答案 4 :(得分:-3)

在我的情况下,alter column无效,因此可以使用'修改'命令,如:

alter table [table_name] MODIFY列[column_name] varchar(1200);