Ningún DBMS que conozco tiene alguna "optimización" que haga que un rendimiento VARCHAR
con una 2^n
longitud funcione mejor que uno con una max
longitud que no sea una potencia de 2.
Creo que las primeras versiones de SQL Server en realidad trataban una VARCHAR
longitud 255 de forma diferente a una con una longitud máxima más alta. No sé si este sigue siendo el caso.
Para casi todos los DBMS, el almacenamiento real que se requiere solo está determinado por la cantidad de caracteres que ingresa, no por la max
longitud que define. Entonces, desde el punto de vista del almacenamiento (y probablemente también del rendimiento), no hace ninguna diferencia si declara una columna como VARCHAR(100)
o VARCHAR(500)
.
Debería ver la max
longitud proporcionada para una VARCHAR
columna como una especie de restricción (o regla comercial) en lugar de una cuestión técnica / física.
Para PostgreSQL, la mejor configuración es usar text
sin una restricción de longitud y CHECK CONSTRAINT
que limite el número de caracteres a lo que su empresa requiera.
Si ese requisito cambia, alterar la restricción de verificación es mucho más rápido que modificar la tabla (porque la tabla no necesita ser reescrita)
Lo mismo se puede aplicar para Oracle y otros, en Oracle sería en VARCHAR(4000)
lugar de eso text
.
No sé si hay una diferencia de almacenamiento físico entre VARCHAR(max)
y, por ejemplo, VARCHAR(500)
en SQL Server. Pero aparentemente hay un impacto en el rendimiento cuando se usa varchar(max)
en comparación con varchar(8000)
.
Ver este enlace (publicado por Erwin Brandstetter como comentario)
Editar 2013-09-22
Con respecto al comentario de bigown:
En Postgres versiones anteriores a 9.2 (que no estaba disponible cuando escribí la respuesta inicial) un cambio en la definición de la columna hizo reescribir toda la tabla, véase, por ejemplo aquí . Dado que 9.2 ya no es así, una prueba rápida confirmó que aumentar el tamaño de la columna para una tabla con 1.2 millones de filas de hecho solo tomó 0.5 segundos.
Para Oracle, esto también parece ser cierto, a juzgar por el tiempo que lleva alterar la varchar
columna de una gran mesa . Pero no pude encontrar ninguna referencia para eso.
Para MySQL, el manual dice " En la mayoría de los casos, ALTER TABLE
hace una copia temporal de la tabla original ". Y mis propias pruebas confirman que: ejecutar ALTER TABLE
una tabla con 1.2 millones de filas (lo mismo que en mi prueba con Postgres) para aumentar el tamaño de una columna tomó 1.5 minutos. En MySQL sin embargo, puede no utilizar la "solución" para utilizar una restricción de comprobación para limitar el número de caracteres en una columna.
Para SQL Server, no pude encontrar una declaración clara sobre esto, pero el tiempo de ejecución para aumentar el tamaño de una varchar
columna (nuevamente la tabla de 1.2 millones de filas de arriba) indica que no tiene lugar la reescritura.
Editar 2017-01-24
Parece que estaba (al menos parcialmente) equivocado sobre SQL Server. Vea esta respuesta de Aaron Bertrand que muestra que la longitud declarada de una nvarchar
o varchar
columnas hace una gran diferencia en el rendimiento.