Considere que tengo la columna VARCHAR(MAX). ¿Qué pasa si lo cambio a VARCHAR(500), Microsoft SQL Server reducirá el tamaño reclamado por la tabla?

Si tiene algún enlace, simplemente coméntelo. Lo comprobaré.

Actualizar:

He probado los siguientes dos casos con tabla.

  • ALTERAR el tamaño de la columna
  • Cree una nueva tabla e importe datos de la tabla anterior.

Tamaño de la tabla inicial

enter image description here

ALTER TABLE table_transaction ALTER COLUMN column_name VARCHAR (500)
Después de la columna ALTER, el tamaño de la tabla aumenta ingrese la descripción de la imagen aquí

Cree una tabla nueva con un tamaño de columna nuevo e importe datos de la tabla anterior
Me he ocupado de Index en una nueva tabla.

enter image description here

Por qué se aumenta el tamaño de la tabla en el caso de ALTER COLUMN. Idealmente, el tamaño de la mesa debería disminuir.

Después de realizar la desfragmentación en PK en la tabla original, disminuyeron algunos MB. Sin embargo, no es tan prometedor como crear una nueva mesa.

0
Vicky Thakor 31 ene. 2015 a las 14:23

2 respuestas

La mejor respuesta

Cuando cambia la columna varchar (n) a varchar (MAX) o viceversa, SQL Server actualizará todas las filas de la tabla. Esto aumentará temporalmente el tamaño de la tabla hasta que reconstruya el índice agrupado o ejecute DBCC CLEANTABLE.

Para los requisitos de espacio en curso de una columna varchar (MAX), el espacio será el mismo que varchar (n) siempre que el valor permanezca en la fila. Sin embargo, si el valor excede los 8000 bytes, se almacenará en páginas LOB separadas dedicadas al valor. Esto aumentará los requisitos de espacio y requerirá E / S adicional cuando una consulta necesite el valor.

Una buena regla general es usar tipos MAX solo si el valor puede exceder los 8000 bytes y especificar una longitud máxima adecuada para el dominio de datos almacenados para datos de 8000 bytes o menos.

2
Dan Guzman 5 feb. 2015 a las 13:05

Según la documentación, no hay diferencia en el almacenamiento de cadenas:

varchar [(n | max)]

Datos de cadena no Unicode de longitud variable. n define la longitud de la cadena y puede ser un valor de 1 a 8.000. max indica que el tamaño máximo de almacenamiento es 2 ^ 31-1 bytes (2 GB). El tamaño de almacenamiento es la longitud real de los datos ingresados ​​+ 2 bytes.

Mientras leo esto, el tamaño de almacenamiento es la longitud real más dos bytes independientemente de si usa n o max.

Sospecho de esto. Esperaría que la longitud de varchar(max) ocupara cuatro bytes. Y puede haber una sobrecarga adicional para almacenar referencias fuera de la página (si existen). Sin embargo, la documentación es bastante clara en este punto.

El hecho de que el cambio del tipo de datos cambie el tamaño del campo depende de los datos ya almacenados. Puede tener varias situaciones.

  • Si todos los valores son NULL, entonces no habrá ningún cambio. Los valores no se almacenan.
  • Si todos los valores tienen menos de 20 bytes, entonces, de acuerdo con la documentación, no habría ningún cambio. Tengo la persistente sospecha de que podría ahorrar 2 bytes por valor, pero no puedo encontrar una referencia y no tengo SQL Server a mano hoy para verificar.
  • Si los valores superan los 20 bytes pero permanecen en la página, ahorrará espacio porque los valores cambiarán.
  • Si los valores se salen de la página, guardará la información del encabezado y también truncará los datos (gracias Dan por señalar esto).
0
Gordon Linoff 31 ene. 2015 a las 14:21