PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy nie używanie NULL w PostgreSQL nadal używa bitmapy NULL w nagłówku?

W rzeczywistości jest to bardziej złożone.

Pusta mapa bitowa wymaga jednego bitu na kolumnę w wierszu, zaokrągloną w górę do pełnych bajtów. Jest tam tylko wtedy, gdy rzeczywisty wiersz zawiera co najmniej jedną wartość NULL i jest w tym przypadku w pełni przydzielony. NOT NULL ograniczenia nie mają na to bezpośredniego wpływu. (Oczywiście, jeśli wszystkie pola w Twojej tabeli są NOT NULL , bitmapa nigdy nie może być zerowa).

„Nagłówek krotki sterty” (na wiersz) ma długość 23 bajtów. Rzeczywiste dane zaczynają się od wielokrotności MAXALIGN (Maksymalne wyrównanie danych ) po tym, co zwykle ma 8 bajtów w 64-bitowym systemie operacyjnym (4 bajty w 32-bitowym systemie operacyjnym). Uruchom następujące polecenie z katalogu binarnego PostgreSQL jako root, aby uzyskać ostateczną odpowiedź:

./pg_controldata /path/to/my/dbcluster

W typowej instalacji Postgres 12 opartej na Debianie wyglądałoby to tak:

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

Tak czy inaczej, między nagłówkiem a wyrównanym początkiem danych znajduje się jeden wolny bajt, który może wykorzystać bitmapa zerowa. Jeśli Twoja tabela zawiera 8 lub mniej kolumn , pamięć NULL jest faktycznie całkowicie darmowa (jeśli chodzi o miejsce na dysku).

Następnie kolejny MAXALIGN (zwykle 8 bajtów) jest przydzielanych dla zerowej mapy bitowej, aby pokryć inne (zwykle) 64 pola. Itd.

Dotyczy to co najmniej wersji 8.4 - 12 i najprawdopodobniej się nie zmieni.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:Dodaj ograniczenie, jeśli jeszcze nie istnieje

  2. Przegląd replikacji logicznej w PostgreSQL

  3. Przycinaj końcowe spacje za pomocą PostgreSQL

  4. Dlaczego pg_restore zwraca pomyślnie, ale w rzeczywistości nie przywraca mojej bazy danych?

  5. Jak wybrać za pomocą klauzuli WITH RECURSIVE