Tengo una tabla que contiene información muy básica. Solo un título y algunos campos de fecha. Hay un campo llamado comentarios que es varchar (4000). La mayoría de las veces lo dejamos en blanco, pero algunas veces ingresaremos una gran cantidad de datos aquí. ¿Es este un diseño realmente malo? ¿O es esto solo un poco ineficiente?
Supongo que sería mejor crear una tabla separada para esta columna.
nota: este es el servidor SQL 2008
SPARSE
y no usandoSPARSE
...Respuestas:
Para un rendimiento más predecible (y para evitar tener una gran variación de filas por página), me inclinaría a almacenar estos datos en una tabla relacionada, especialmente si solo se llena un pequeño porcentaje del tiempo, y especialmente si solo se recupera en Algunas de las consultas. Las filas donde está este valor
NULL
contribuyen a la sobrecarga de espacio, pero esto es mínimo. Lo más importante será cómo una página puede caber solo en dos filas y la página siguiente puede caber en 500 filas; esto realmente puede afectar las estadísticas y es mejor dividir esto para que se almacene por separado y no afecte todas sus operaciones en La mesa central.fuente
Ocupa un espacio mínimo cuando no se usa
La sobrecarga es mínima y la optimización será prematura.
Hasta que sepa que tiene un problema, simplemente manténgalo en una tabla. Rompe KISS introduciendo combinaciones externas y agregando una sobrecarga al consultar los datos.
Ver /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 para más
fuente
Creo que una tabla separada sería mejor para mejorar la densidad de la página y reducir la fragmentación, especialmente si no siempre llena ese campo.
Todas estas páginas vacías y punteros conducen a un bajo rendimiento. Normaliza ese campo si puedes.
fuente
Esta pregunta es muy similar: ¿las columnas vacías adicionales afectan significativamente el tamaño de la tabla sql?
Parece que la respuesta es sí, ocupa espacio, pero hay un algoritmo de compresión para columnas con muchos valores nulos.
En cuanto al diseño, creo que tener una tabla externa vinculada a esto sería un diseño más limpio. Tener una columna con valores nulos frecuentes hace que sea más difícil para los usuarios de la base de datos, ya que podrían usar accidentalmente un valor nulo si no tienen cuidado. Por lo tanto, el código que usa la base de datos debería contener una comprobación de errores y simplemente se vuelve feo a partir de ahí.
fuente
SPARSE
, no solo "columnas con muchos valores nulos".Estarás bien: ya es una columna varchar, por lo que solo usa espacio cuando contiene datos. Si tenía muchas columnas de tamaño fijo anulables como int, podría tener problemas de uso de espacio.
En cuanto a ponerlo en otra mesa, no me molestaría. También puede mirar usando varchar (max) y las opciones de entrada / salida de fila. De nuevo, probablemente prematuro.
fuente