2011-02-07 12 views
5

Mentre è già documentato che NULL occupa solo 1 bit nell'intestazione tuple postgresql per la riga, quanto spazio occupa NULL nell'INDICE di una colonna nullable (non la tupla, ma l'indice)? È lo stesso 1 bit all'interno dell'indice come nella tupla, o è la dimensione del tipo di dati della colonna completa (EG: intero = 4 byte)?I NULL occupano spazio negli indici postgresql?

Il contesto per la domanda è che ho una tabella di PostgreSQL che ha 3 colonne che fanno riferimento (EG: foo_id, bar_id e baz_id) e per ogni riga, solo una di queste colonne avrebbe un valore (le altre 2 colonne sarebbe essere NULL). Tuttavia, ho bisogno che tutte e 3 le colonne siano indicizzate. Supponendo che ogni colonna sia un intero (4 byte in postgresql), ogni riga dovrebbe occupare 4 byte (per la colonna non nulla) più 2 bit (per le 2 colonne null). Tuttavia, se dovessi aggiungere indici per tutte e 3 le colonne, la memorizzazione per i 3 indici sarebbe di 12 byte (se l'indice occupa i 4 byte completi per un valore nullo) o gli stessi 4 byte + 2 bit come nel tupla stessa.

+0

Bene, 1 modo in cui è possibile rispondere parzialmente a se stessi: non è possibile rappresentare (solo) lo stesso numero di byte richiesto dal tipo di dati. Nel tuo esempio int, ogni combinazione possibile di 4 byte rappresenta un valore int valido, quindi non c'è modo che un null possa essere codificato in quegli stessi quattro byte. –

risposta

1

Le routine di accesso btree utilizzano PageGetItem() per ottenere la chiave effettiva dall'indice. Pertanto, credo che le pagine indice utilizzino lo stesso schema di archiviazione delle normali pagine heap (inclusa la maschera nullability), hanno solo ulteriori informazioni di navigazione nella regione "speciale" della pagina per contenere tutti i puntatori btree.

Problemi correlati