Como de varchar
todos modos asigna espacio dinámicamente, mi pregunta es si el uso varchar(255)
es más eficiente o ahorra más espacio en comparación con el uso varchar(5000)
. ¿Si es así por qué?
sql-server
Tintín
fuente
fuente
Respuestas:
Sí,
varchar(5000)
puede ser peor quevarchar(255)
si todos los valores encajaran en este último. La razón es que SQL Server estimará el tamaño de los datos y, a su vez, las concesiones de memoria en función del tamaño declarado (no real ) de las columnas en una tabla. Cuando lo haya hechovarchar(5000)
, supondrá que cada valor tiene una longitud de 2.500 caracteres y reservará memoria en función de eso.Aquí hay una demostración de mi reciente presentación de GroupBy sobre malos hábitos que hace que sea fácil probarlo por sí mismo (requiere SQL Server 2016 para algunas de las
sys.dm_exec_query_stats
columnas de salida, pero aún debe ser demostrable conSET STATISTICS TIME ON
u otras herramientas en versiones anteriores); muestra una memoria más grande y tiempos de ejecución más largos para la misma consulta con los mismos datos ; la única diferencia es el tamaño declarado de las columnas:Entonces, sí, dimensione correctamente sus columnas , por favor.
Además, volví a ejecutar las pruebas con varchar (32), varchar (255), varchar (5000), varchar (8000) y varchar (max). Resultados similares ( haga clic para ampliar ), aunque las diferencias entre 32 y 255, y entre 5,000 y 8,000, fueron insignificantes:
Aquí hay otra prueba con el
TOP (5000)
cambio para la prueba más completamente reproducible por la que me acosaron sin cesar ( haga clic para agrandar ):Entonces, incluso con 5,000 filas en lugar de 10,000 filas (y hay más de 5,000 filas en sys.all_columns al menos tan atrás como SQL Server 2008 R2), se observa una progresión relativamente lineal, incluso con los mismos datos, cuanto mayor sea el tamaño definido de la columna, se necesita más memoria y tiempo para satisfacer exactamente la misma consulta (incluso si no tiene sentido
DISTINCT
).fuente
varchar(450)
yvarchar(255)
sería la misma? (¿O algo por debajo de 4000?)rowcount*(column_size/2)
.