2010-11-19 13 views
25

digamos que tengo una columna en mi mesa define lo siguiente:¿Cuánto espacio de disco se necesita para almacenar un valor NULL utilizando postgresql DB?

"MyColumn" smallint NULL 

Almacenamiento de un valor como 0, 1 o alguna otra cosa debe necesitan 2 bytes (1). ¿Pero cuánto espacio se necesita si configuro "MyColumn" en NULL? Necesitará 0 bytes?

¿Hay algunos bytes adicionales necesarios para la administración o cosas por cada columna/fila?

(1) http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

Respuesta

31

columnas nulos no se almacenan. La fila tiene un mapa de bits al inicio y un bit por columna que indica cuáles son nulos o no nulos. El mapa de bits podría omitirse si todas las columnas no son nulas en una fila. Entonces, para cualquier fila dada con uno o más valores nulos, el tamaño agregado sería el del mapa de bits (N bits para una tabla de columnas N, redondeadas hacia arriba).

discusión más profunda de los documentos here

0

lo necesita 1 byte (0x00) sin embargo, es la estructura de la tabla que constituye la mayor parte del espacio, la adición de éste valor podría cambiar algo (como la adición de una fila) que necesita más espacio que la suma de los datos en él.

Editar: Laramie parece saber más sobre nula que yo :)

30

Laramie es correcto sobre el mapa de bits y se vincula al lugar correcto en el manual. Sin embargo, esto es casi, pero no del todo correcta:

Así que para cualquier fila dada con uno o más valores nulos, el tamaño agregado a él sería el del mapa de bits (N bits para una tabla de N-columna, redondeado).

Uno tiene que tener en cuenta la alineación de datos. El HeapTupleHeader (por fila) tiene una longitud de 23 bytes, los datos de columna reales siempre comienzan en un múltiplo de MAXALIGN (normalmente 8 bytes). Eso deja un byte de relleno que puede ser utilizado por el mapa de bits nulo. En efecto, el almacenamiento NULL es completamente gratuito para tablas de hasta 8 columnas.

Después de eso, se asignan otros MAXALIGN (normalmente 8) bytes para las siguientes columnas MAXALIGN * 8 (normalmente 64). Etc. Siempre para el número total de columnas de usuario (todo o nada). Pero solo si hay al menos un valor NULL real en la fila.

Realicé pruebas exhaustivas para verificar todo eso. Más detalles:

+2

Adición de columnas sin un valor por defecto para tablas de gran tamaño suele ser una operación rápida. ¿Puede ser lento cuando cruzas el umbral entre 8 y 9 columnas (o 72 y 73 con 'MAXALIGN = 8')? –

+1

@ PatrickBrinich-Langlois: Sí, esa es una posible consecuencia del mecanismo. El tamaño de la tabla física también sube más de lo que cabría esperar en estos casos. El efecto no es necesariamente lineal ya que están involucrados otros factores como las tuplas muertas. La tabla no crece en absoluto si los mapas de bits NULL existentes (por fila) tienen espacio para otro bit NULO, que es el caso común. –

Cuestiones relacionadas