Um weiter zu erklären, was Jayadevan geschrieben hat.
Postgres arbeitet mit Transaktionen und verfolgt die sichtbaren Daten, indem interne Transaktions-IDs verglichen werden. Da diese Transaktionen jedoch früher oder später eine 32-Bit-Ganzzahl sind, werden sie umbrochen, und daher sieht die neue Transaktion so aus, als ob sie in der Vergangenheit durchgeführt wurde (und ist daher in einer aktuellen Transaktion sichtbar, obwohl dies nicht der Fall sein sollte) ältere Transaktionen werden so aussehen, als würden sie in der Zukunft ausgeführt (und da die Zukunft noch nicht existiert, werden diese Daten nicht mehr sichtbar sein).
Um diesem Problem entgegenzuwirken, weist Postgres jeder Zeile, die alt genug ist, um unter diesem Umbruch zu leiden, eine spezielle Transaktions-ID zu, die immer älter als jede Transaktion ist. Sie können sehen, dass gültige Transaktions-IDs zwischen 0 und 2147483647 liegen. Dabei wird die Transaktions-ID für alle aktuellen Zeilen auf -1 gesetzt.
Da das Vakuum im Grunde genommen dazu dient, leeren Raum für die Wiederverwendung zu markieren, funktioniert es nur auf Datenseiten, die geändert wurden.
Im VACUUM FREEZE
Grunde genommen wird die Transaktions-ID für alle Seiten eingefroren, unabhängig davon, ob sie geändert wurden oder nicht, sodass alle aktuellen Zeilen für alle neuen Transaktionen als alt angesehen werden.
Ab Version 8.2 VACUUM FREEZE
sind sie jedoch veraltet und sollten nicht mehr verwendet werden. Stattdessen gibt die Parameter ist vacuum_freeze_table_age
und autovacuum_freeze_max_age
die angibt , wie viele Transaktionen auftreten können , bevor eine vollständige Abtastung auf dem Tisch (effektiv eine interne tun getan wird, um VACUUM FREEZE
auf dem Tisch).