sql >> Database teknologi >  >> RDS >> PostgreSQL

Bruger ikke NULL i PostgreSQL stadig en NULL bitmap i headeren?

Det er faktisk mere komplekst end som så.

Null-bitmap'et har brug for en bit pr. kolonne i rækken, rundet op til hele bytes. Den er der kun, hvis den faktiske række indeholder mindst én NULL-værdi og i så fald er fuldt allokeret. NOT NULL begrænsninger påvirker ikke direkte det. (Selvfølgelig, hvis alle felter i din tabel er NOT NULL , der kan aldrig være en null bitmap.)

"Heap tuple header" (pr. række) er 23 bytes lang. Faktiske data starter ved et multiplum af MAXALIGN (Maksimal datajustering ) efter det, hvilket typisk er 8 bytes på 64-bit OS (4 bytes på 32-bit OS). Kør følgende kommando fra din PostgreSQL binære katalog som root for at få et endeligt svar:

./pg_controldata /path/to/my/dbcluster

På en typisk Debian-baseret installation af Postgres 12 ville det være:

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

Uanset hvad, er der én ledig byte mellem headeren og den justerede start af dataene, som null-bitmap kan bruge. Så længe din tabel har 8 kolonner eller færre , NULL-lagring er faktisk helt gratis (hvad angår diskplads).

Derefter en anden MAXALIGN (typisk 8 bytes) er allokeret til null bitmap til at dække yderligere (typisk) 64 felter. osv.

Dette er gyldigt for mindst version 8.4 - 12 og vil højst sandsynligt ikke ændre sig.



  1. Geo-søgning (afstand) i PHP/MySQL (ydelse)

  2. Skinner:Ingen forbindelsespulje til ActiveRecord::Base

  3. tilpasse pager i psql

  4. Brug af en betinget UPDATE-sætning i SQL