2011-09-22 15 views
78

Estoy usando SQL Server 2008 y necesito hacer un campo VARCHAR más grande, de (200 a 1200) en una tabla con aproximadamente 500k filas. Lo que necesito saber es si hay algún problema que no haya considerado.Al aumentar el tamaño de la columna VARCHAR en una tabla grande, ¿podría haber algún problema?

Me va a utilizar esta declaración TSQL:

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

ya he probado en una copia de los datos y esta declaración tenido ningún efecto negativo que pudiera ver.

¿Hay algún problema posible al hacer esto que no haya considerado?

Por cierto, la columna no está indexada.

+1

@nonnb: esa es una idea horrible. http://stackoverflow.com/q/2091284/27535 – gbn

+0

@gbn ¿Alguna idea sobre la respuesta reciente de Justin a esa pregunta? Parece estar en desacuerdo con los tuyos. – AakashM

+0

@AakashM: tiene razón sobre el almacenamiento, pero es una sobrecarga, no una optimización. Ahora lea este http://stackoverflow.com/q/2009694/27535 – gbn

Respuesta

54

Esto es un cambio de metadatos solamente: rápido

Una observación: especifique NULL o NOT NULL explícita para evitar "accidentes" si uno de los ajustes de SET ANSI_xx son diferentes, por ejemplo de ejecución en osql no SSMS por alguna razón

+1

Todo fue bien con esto. No hay problemas. –

+0

¿Sabes si se aplican las mismas reglas al pasar de 'varchar (200)' a 'varchar (max)'? – CodeNaked

+0

@CodeNaked: esto es mucho más complicado de responder. (max) es un tipo de LOB que puede estar "en fila" o fuera de la fila.Sin embargo, me inclino a decir que debería ser el mismo porque los datos ya están "en fila" y no se necesitaría reconstruir la tabla. – gbn

4

Cambiar a VARCHAR (1200) de VARCHAR (200) no debería causar ningún problema, ya que solo se trata de un cambio de metadatos y, dado que SQL Server 2008 trunca excesivamente los espacios en blanco, no debería haber diferencias de rendimiento, por lo que no debería haber problemas para realizar el cambio.

+0

Creo que esto puede ser cierto para tablas pequeñas, pero para tablas grandes que están siendo consultadas activamente este podría bloquear durante una cantidad significativa de tiempo (ya que el servidor SQL necesita ver si necesita truncar cada fila). – CodeNaked

-3

En mi caso modificar la columna no estaba funcionando así que uno puede usar el comando 'Modificar', como:

alter table [nombre_tabla] MODIFICAR columna [COLUMN_NAME] varchar (1200);

+4

Eso es porque no estás usando SQL Server por la pregunta (pero MySQL, probablemente). "ALTER TABLE ... MODIFY" no es válido T-SQL. –

5

sólo quería añadir mis 2 centavos, ya que googled esta pregunta b/c me encontré en una situación similar ...

ser consciente que mientras se cambia de varchar(xxx) a varchar(yyy) es un meta-datos cambiar de hecho, pero cambiar a varchar(max) no lo es. Debido a que los valores varchar(max) (también conocidos como valores BLOB - imagen/texto, etc.) se almacenan de manera diferente en el disco, no dentro de una fila de la tabla, sino "fuera de la fila". Entonces el servidor se volverá loco en una gran mesa y dejará de responder por minutos (horas).

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

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

PS. lo mismo se aplica a nvarchar o por supuesto.

Cuestiones relacionadas