2011-02-07 11 views
5

Si bien se documenta fácilmente que los NULL ocupan solo 1 bit en el encabezado de tupla postgresql para la fila, ¿cuánto espacio ocupan los NULL en el ÍNDICE de una columna que admite nulos (no la tupla, sino el índice)? ¿Es el mismo 1 bit dentro del índice que en la tupla, o es el tamaño de tipo de datos de la columna completa (por ejemplo, integer = 4 bytes)?¿Los NULL ocupan espacio dentro de los índices postgresql?

El contexto para la pregunta es que tengo una tabla postgresql que tiene 3 columnas de referencia (EG: foo_id, bar_id y baz_id) y para cualquier fila, solo una de esas columnas tendría un valor (las otras 2 columnas ser NULL). Sin embargo, necesito que se indexen las 3 columnas. Suponiendo que cada columna es un entero (4 bytes en postgresql), cada fila debe ocupar 4 bytes (para la columna no nula) más 2 bits (para las 2 columnas nulas). Sin embargo, si tuviera que agregar índices para las 3 columnas, el almacenamiento para los 3 índices sería 12 bytes (si el índice toma los 4 bytes completos para un valor nulo) o los mismos 4 bytes + 2 bits como en el tupla en sí misma.

+0

Bueno, 1 forma en que puede responder parcialmente esto usted mismo - no podrían ser representados por (solo) la misma cantidad de bytes que los requeridos por el tipo de datos. En su ejemplo int, cada combinación posible de 4 bytes representa un valor int válido, por lo que no es posible codificar un valor nulo en esos mismos cuatro bytes. –

Respuesta

1

Las rutinas de acceso btree usan PageGetItem() para obtener la clave real del índice. Así que creo que las páginas de índice de btree usan el mismo esquema de almacenamiento que las páginas de montón comunes (incluida la máscara de anulación), solo tienen información de navegación adicional en la región "especial" de la página para contener todos los punteros de btree.

Cuestiones relacionadas