sql >> Databáze >  >> RDS >> PostgreSQL

Nepoužívá se při použití NULL v PostgreSQL stále bitmapa NULL v záhlaví?

Ve skutečnosti je to složitější.

Nulová bitmapa potřebuje jeden bit na sloupec v řádku, zaokrouhlený nahoru na celé bajty. Je zde pouze v případě, že skutečný řádek obsahuje alespoň jednu hodnotu NULL a je v takovém případě plně přidělen. NOT NULL omezení to přímo neovlivňují. (Samozřejmě, pokud jsou všechna pole vaší tabulky NOT NULL , nikdy nemůže existovat nulová bitmapa.)

"Hlava n-tice haldy" (na řádek) je dlouhá 23 bajtů. Skutečná data začínají na násobku MAXALIGN (Maximální zarovnání dat ), což je obvykle 8 bajtů na 64bitovém OS (4 bajty na 32bitovém OS). Spusťte následující příkaz z vašeho binárního adresáře PostgreSQL jako root, abyste získali definitivní odpověď:

./pg_controldata /path/to/my/dbcluster

Na typické instalaci Postgres 12 založené na Debianu by to bylo:

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

V obou případech je mezi záhlavím a zarovnaným začátkem dat jeden volný bajt, který může nulová bitmapa využít. Pokud má tabulka 8 nebo méně sloupců , úložiště NULL je efektivně zcela zdarma (pokud jde o místo na disku).

Poté další MAXALIGN (obvykle 8 bajtů) je přiděleno pro nulovou bitmapu, aby pokrylo dalších (obvykle) 64 polí. atd.

Toto platí minimálně pro verze 8.4 – 12 a s největší pravděpodobností se nezmění.



  1. Auto Increment Column – Sekvence jako výchozí hodnota v Oracle

  2. MySQL:NULL vs

  3. Jak najít rozdíl v hodnotách černobílého formátu TIMESTAMP v Oracle?

  4. Jak formátovat čísla jako římské číslice v Oracle