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


87

我正在使用SQL Server 2008,并且需要在具有约50万行的表上将VARCHAR字段变大,从(200到1200)。我需要知道的是是否有未考虑的问题。

我将使用以下TSQL语句:

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

我已经在数据副本上进行了尝试,并且该语句没有我看到的不良影响。

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

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


1
@nonnb:那是一个可怕的主意。stackoverflow.com/q/2091284/27535
gbn

@gbn对贾斯汀最近对该问题的回答有何想法?似乎与您有些矛盾。
AakashM 2011年

@AakashM:他对存储是正确的,但这是开销,而不是优化。现在,请阅读此stackoverflow.com/q/2009694/27535
gbn

@gbn-好点,马丁·史密斯(Martin Smith)对索引的观察也是如此。取消。
StuartLC 2011年

2
最终结果只有一个陷阱!该字段已被索引,当有人尝试输入大于900b的条目时,它失败了!被警告。
Paul T Davies

Answers:


59

这仅是元数据更改:快速。

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


1
一切都很好。没问题。
Paul T Davies

您知道从varchar(200)到时是否适用相同的规则varchar(max)吗?
CodeNaked

@CodeNaked:这要棘手得多。(max)是LOB类型,可以是“行内”或行外。但是,我倾向于说它应该是相同的,因为数据已经“在行中”并且不需要重建表了
gbn 2014年

12

只是想加我的2美分,因为我在b / c上搜索这个问题后,发现自己处在类似的情况下...

要注意的是,虽然从改变varchar(xxx)varchar(yyy)是元数据的变化确实,但改变到varchar(max)是没有的。因为varchar(max)值(aka BLOB值-图像/文本等)以不同的方式存储在磁盘上,而不是存储在表行中,而是存储在“行外”。因此,服务器将在一个大桌子上发疯,并在几分钟(几小时)内变得无响应。

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

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

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


4

从Varchar(200)更改为Varchar(1200)应该不会造成任何问题,因为它只是元数据更改,并且随着SQL Server 2008截断过多的空格,您也不会看到性能差异,因此简而言之,使用更改。


我认为这对于小型表可能是正确的,但是对于正在被主动查询的大型表,这可能会阻塞大量的时间(因为SQL Server需要查看是否需要截断每一行)。
CodeNaked

0

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


-3

在我的情况下,alter列不起作用,因此可以使用“修改”命令,例如:

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


5
那是因为您没有针对每个问题使用SQL Server(可能是MySQL)。“ ALTER TABLE ... MODIFY”无效的T-SQL。
Jeroen Mostert 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.