¿Debo usar varchar(255)
o varchar(256)
al diseñar tablas? Escuché que se usa un byte para la longitud de la columna o para almacenar metadatos.
¿Importa más en este punto?
Vi algunas publicaciones en Internet, sin embargo, se aplican a Oracle y MySQL.
Tenemos Microsoft SQL Server 2016 Enterprise Edition, ¿cómo se aplica a este entorno?
Ahora, por ejemplo, qué pasa si les digo a mis clientes que guarden, por ejemplo, una descripción de texto de 255 caracteres en lugar de 256, ¿hay alguna diferencia? Lo que leí "Con una longitud máxima de 255 caracteres, el DBMS puede elegir usar un solo byte para indicar la longitud de los datos en el campo. Si el límite fuera 256 o más, se necesitarían dos bytes". ¿Es esto cierto?
Respuestas:
Dimensione cada columna apropiadamente. NO use un tamaño "estándar" para cada columna. Si solo necesita 30 caracteres, ¿por qué crear una columna que pueda manejar 255? Estoy muy contento de que no estés recomendando usar
varchar(max)
tus columnas de cadena.Este es un consejo especialmente prudente si alguna vez necesita indexar una columna, o si está utilizando una columna como clave principal y tiene referencias de clave externa. SQL Server utiliza el tamaño de cada columna en su optimizador de consultas para comprender los requisitos de memoria estimados para el procesamiento de consultas. Tener columnas sobredimensionadas puede ser perjudicial para el rendimiento.
Los índices en columnas que son de gran tamaño pueden generar errores:
El intento de crear el índice anterior da como resultado esta advertencia:
900 bytes es el tamaño de clave máximo para los índices agrupados (y los índices no agrupados en SQL Server 2012 y versiones anteriores). 1700 bytes es el tamaño de clave máximo para índices no agrupados en versiones más recientes de SQL Server. Si diseña columnas con un ancho genérico, como (255), puede encontrar esta advertencia con mucha más frecuencia de lo esperado.
En caso de que esté interesado en elementos internos de almacenamiento, puede usar la siguiente pequeña prueba para comprender mejor cómo SQL Server almacena datos sin almacenar en filas.
Primero, crearemos una tabla donde podamos almacenar columnas de varios tamaños:
Ahora insertaremos una sola fila:
Esta consulta utiliza las funciones no documentadas y no compatibles,
sys.fn_RowDumpCracker
ysys.fn_PhyslocCracker
para mostrar algunos detalles interesantes sobre la tabla:La salida se verá similar a esto:
Como puede ver,
InRowLength
se muestra el valor de cada valor, junto con la ubicación de almacenamiento físico de cada fila: "file_id", "page_id" y "slot_id".Si tomamos los valores
file_id
ypage_id
de los resultados de la consulta anterior y los ejecutamosDBCC PAGE
, podemos ver el contenido real de la página física:Los resultados de mi máquina son:
fuente
Otros ya han señalado que el número de bytes necesarios para almacenar la longitud es fijo. Quería centrarme en esta parte en su pregunta:
Tiene su pregunta etiquetada con la edición empresarial, lo que generalmente significa que tendrá una buena cantidad de datos. A menudo, las diferencias de un byte por fila realmente no importan demasiado en la práctica. Por ejemplo, la siguiente tabla con una
VARCHAR(255)
columna completamente ocupada ocupa 143176 KB de espacio en el disco:Resultados:
Creemos una segunda tabla con una
VARCHAR(256)
columna completamente llena . Eso tomará al menos un byte más por fila, ¿verdad?Resultados:
Sucede que ambas tablas ocupan la misma cantidad de espacio. Se ajusta el mismo número de filas en cada página de 8k. Es genial que quieras pasar tiempo optimizando tu aplicación, pero sospecho que es mejor que te concentres en diferentes áreas.
fuente
El tamaño declarado del varchar no tiene impacto en el rendimiento. Los datos pueden almacenarse realmente como un almacén de filas con compresión de página o compresión de fila. Como un almacén de columnas en clúster, o como una tabla con memoria optimizada. Cada uno de estos tendrá diferentes compensaciones de rendimiento, pero nunca importa si declara un varchar (255) o varchar (256).
fuente