sql >> Database >  >> RDS >> PostgreSQL

Gebruikt het gebruik van NULL in PostgreSQL nog steeds een NULL-bitmap in de header?

Het is eigenlijk ingewikkelder dan dat.

De null-bitmap heeft één bit per kolom in de rij nodig, afgerond op hele bytes. Het is er alleen als de daadwerkelijke rij ten minste één NULL-waarde bevat en in dat geval volledig is toegewezen. NOT NULL beperkingen hebben daar niet direct invloed op. (Natuurlijk, als alle velden van uw tabel NOT NULL zijn , er kan nooit een null-bitmap zijn.)

De "heap tuple header" (per rij) is 23 bytes lang. Werkelijke gegevens beginnen bij een veelvoud van MAXALIGN (Maximale gegevensuitlijning ) daarna, wat meestal 8 bytes is op 64-bits besturingssysteem (4 bytes op 32-bits besturingssysteem). Voer de volgende opdracht uit vanuit uw PostgreSQL binaire dir als root om een ​​definitief antwoord te krijgen:

./pg_controldata /path/to/my/dbcluster

Op een typische Debian-gebaseerde installatie van Postgres 12 zou dat zijn:

sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main

Hoe dan ook, er is één vrije byte tussen de kop en het uitgelijnde begin van de gegevens, die de null-bitmap kan gebruiken. Zolang uw tabel 8 kolommen of minder . heeft , NULL-opslag is effectief absoluut gratis (wat schijfruimte betreft).

Daarna nog een MAXALIGN (meestal 8 bytes) wordt toegewezen aan de null-bitmap om nog eens (meestal) 64 velden te bestrijken. enz.

Dit is geldig voor ten minste versies 8.4 - 12 en zal hoogstwaarschijnlijk niet veranderen.



  1. UI-ontwerppatronen die niet worden geschaald

  2. Hybride OLTP/Analytics-databaseworkloads:MySQL-gegevens repliceren naar ClickHouse

  3. Android:hoe een contact van de telefoon importeren?

  4. Een lange tekenreeks invoegen in CLOB-gegevenstype in Oracle