Tengo una tabla con 490 M de filas y 55 GB de espacio de tabla, por lo que unos 167 bytes por fila. La tabla tiene tres columnas: a VARCHAR(100)
, a DATETIME2(0)
y a SMALLINT
. La longitud promedio del texto en el VARCHAR
campo es de aproximadamente 21.5, por lo que los datos sin procesar deben ser de alrededor de 32 bytes por fila: 22 + 2 para el VARCHAR
, 6 para el DATETIME2
y 2 para el entero de 16 bits.
Tenga en cuenta que el espacio anterior es solo de datos, no de índices. Estoy usando el valor informado en Propiedades | Almacenamiento | General | Espacio de datos.
Por supuesto, debe haber algo de sobrecarga, pero 135 bytes por fila parece mucho, especialmente para una tabla grande. ¿Por qué podría ser esto? ¿Alguien más ha visto multiplicadores similares? ¿Qué factores pueden influir en la cantidad de espacio extra requerido?
A modo de comparación, intenté crear una tabla con dos INT
campos y 1 M de filas. El espacio de datos requerido fue de 16.4 MB: 17 bytes por fila, en comparación con 8 bytes de datos sin procesar. Otra tabla de prueba con una INT
y una VARCHAR(100)
con el mismo texto que la tabla real usa 39 bytes por fila (44 K filas), donde esperaría 28 más un poco.
Por lo tanto, la tabla de producción tiene considerablemente más gastos generales. ¿Es esto porque es más grande? Esperaría que los tamaños de índice fueran aproximadamente N * log (N), pero no veo por qué el espacio requerido para que los datos reales no sean lineales.
¡De antemano, gracias por cualquier consejo!
EDITAR:
Todos los campos enumerados son NOT NULL
. La tabla real tiene un PK agrupado en el VARCHAR
campo y el DATETIME2
campo, en ese orden. Para las dos pruebas, la primera INT
fue la PK (agrupada).
Si es importante: la tabla es un registro de resultados de ping. Los campos son URL, fecha / hora de ping y latencia en milisegundos. Los datos se agregan constantemente y nunca se actualizan, pero los datos se eliminan periódicamente para reducirlos a solo unos pocos registros por hora por URL.
EDITAR:
Una respuesta muy interesante aquí sugiere que, para un índice con mucha lectura y escritura, la reconstrucción puede no ser beneficiosa. En mi caso, el espacio consumido es una preocupación, pero si el rendimiento de escritura es más importante, uno podría estar mejor con índices flácidos.
fuente
VARCHAR
s en mi estimación anterior, pero no el recuento de columnas. Esta tabla no tiene campos NULLable (debería haber mencionado eso), ¿todavía les asigna bytes?¿Han cambiado los tipos de datos con el tiempo? ¿Se han eliminado las columnas de longitud variable? ¿Se han desfragmentado los índices con frecuencia pero nunca se han reconstruido? ¿Se han eliminado muchas filas o se han actualizado significativamente muchas columnas de longitud variable? Alguna buena discusión aquí .
fuente
VARCHAR
yDATETIME2
, en ese orden. Las inserciones se distribuirán uniformemente para el primer campo. Para el segundo campo, los valores nuevos y siempre serán mayores que los existentes.