Si los valores NULL
llegan al índice o no dependen al menos del tipo del índice. Básicamente, esto sería SÍ para btree
y gist
tipos de índices, NO para hash
, y parece SÍ o NO para gin
tipos de índices en función de la versión de PostgreSQL.
Solía haber una columna booleana amindexnulls
en la tabla pg_catalog.pg_am
que contenía esa información, pero no está en 9.1. Probablemente porque los índices se han vuelto aún más sofisticados entre las mejoras PG.
En el caso específico de sus datos, la mejor manera de saber sería medir la diferencia de tamaño de los índices, utilizando la función pg_relation_size('index_name')
, entre los contenidos completamente NULOS y completamente NO NULOS, con su versión PG exacta, tipo de datos exacto, tipo de índice exacto y definición. Y sepa que posiblemente, un cambio futuro en cualquiera de estos parámetros puede cambiar el resultado.
Pero en cualquier caso, si "sólo" quiere evitar los nulos de indexación, que siempre es posible crear un índice parcial:
CREATE INDEX partial_idx(col) ON table WHERE (col is not null)
Esto va a tomar menos espacio, pero si esto se va a la ayuda o no con la realización de consultas depende de estas consultas.
"El almacenamiento NULL es totalmente gratuito para tablas de 8 columnas o menos". - ¿Qué pasa si solo 1 columna contiene nulo? esto significa que el mapa de bits nulo con 1 byte se creará solo para mantener 1 bit? – Dejell
El mapa de bits nulo está allí si hay valores nulos, con suficientes bytes para cubrir todas las columnas, más relleno al siguiente múltiplo de 'MAXALIGN'. –
Gracias Erwin. Todavía no estoy seguro, ¿y si no tengo ningún valor nulo? ¿Todavía estaría allí? (tabla de muchos a muchos) – Dejell