PostgreSQL 13: Paralleles VAKUUM

Neulich hat Amit Kapila einen Masahiko Sawada-Patch angebracht, der eine parallele Reinigung ermöglicht. Die Tabelle selbst wird weiterhin von einem (führenden) Prozess gelöscht. Um jedoch Indizes zu bereinigen, können jetzt Hintergrundworkflows gestartet werden, einer für jeden Index. Im manuellen Modus können Sie so die Bereinigung großer Tabellen mit mehreren Indizes beschleunigen. Die automatische Reinigung nutzt diese Funktion noch nicht.

Verwandte Links:


Wie Sie wissen , besteht der Tischreinigungsprozess aus mehreren Phasen.

Zunächst wird die Tabelle gescannt und Links zu unnötigen ("toten") Versionen von Zeilen werden im Speicher gesammelt. Der Speicher wird durch die begrenzten maintenance_work_mem Parameter , so dass alle Links nicht auf einmal passen.

Dann werden alle Indizes nacheinander sortiert (wie zuvor) und Zeiger auf gefundene tote Versionen von Zeichenfolgen werden aus ihnen gelöscht.

Dann wird der bereits angezeigte Teil der Tabelle erneut gescannt und tote Versionen der Zeilen werden bereits daraus gelöscht.

Wenn es zu einem Zeitpunkt nicht möglich war, alle toten Versionen von Zeichenfolgen zu verarbeiten, wird der Speicher gelöscht und der gesamte Vorgang wird an der Stelle wiederholt, an der wir das letzte Mal angehalten haben.

Dieses gesamte Schema bleibt unverändert, aber jetzt können Indizes parallel gelöscht werden. Zu diesem Zweck startet der Lead-Prozess mehrere Workflows, die vorhandene Indizes analysieren und verarbeiten. Ein Index wird nur von einem Prozess verarbeitet. Nachdem alle Indizes gelöscht wurden, sind die Workflows abgeschlossen und der Moderator fährt mit der nächsten Phase fort.

Nehmen Sie zum Beispiel die ticket_flights Demobase-Flugtabelle . Es gibt einen Index, aber Sie können noch ein paar mehr erstellen.

demo=# CREATE index on ticket_flights (fare_conditions);
demo=# CREATE index on ticket_flights (amount);

An der Parallelverarbeitung sind nur Indizes beteiligt, deren Größe den Wert des Parameters min_parallel_index_scan_size überschreitet . Unsere Indizes sind geeignet:

demo=# SHOW min_parallel_index_scan_size;
 min_parallel_index_scan_size 
------------------------------
 512kB
(1 row)
demo=# SELECT pg_size_pretty(pg_relation_size(indexname::regclass))
FROM pg_indexes
WHERE tablename = 'ticket_flights';
 pg_size_pretty 
----------------
 325 MB
 187 MB
 180 MB
(3 rows)

Aktualisieren Sie die Hälfte der Zeilen, um die Bereinigungsarbeiten zu laden:

demo=# UPDATE ticket_flights SET amount = amount + 1 WHERE random() > 0.5;
UPDATE 4194262

Gehen.

demo=# VACUUM VERBOSE ticket_flights;
INFO:  vacuuming "bookings.ticket_flights"
INFO:  launched 2 parallel vacuum workers for index vacuuming (planned: 2)
INFO:  scanned index "ticket_flights_fare_conditions_idx" to remove 4194262 row versions by parallel vacuum worker
DETAIL:  CPU: user: 1.84 s, system: 0.41 s, elapsed: 11.82 s
INFO:  scanned index "ticket_flights_amount_idx" to remove 4194262 row versions by parallel vacuum worker
DETAIL:  CPU: user: 2.31 s, system: 0.44 s, elapsed: 12.95 s
INFO:  scanned index "ticket_flights_pkey" to remove 4194262 row versions
...
INFO:  "ticket_flights": found 4194262 removable, 8391852 nonremovable row versions in 104885 out of 104885 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 630
There were 0 unused item identifiers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 9.91 s, system: 4.40 s, elapsed: 121.40 s.
VACUUM

Es ist ersichtlich, dass der führende Prozess zwei Arbeiter ins Leben gerufen und einen Index genommen hat.

Die Anzahl der Arbeitsprozesse kann explizit angegeben werden (in jedem Fall wird natürlich max_parallel_maintenance_workers nicht überschritten , was max_worker_processes nicht überschreitet ). Ein expliziter Hinweis kann insbesondere verwendet werden, um die Parallelität zu deaktivieren:

demo=# VACUUM (PARALLEL 0, VERBOSE) ticket_flights;

Ich hoffe, dass dieses Thema weiterentwickelt wird. Die Tabelle konnte durch mehrere Prozesse parallel gescannt werden (dies war im ursprünglichen Savada-Patch enthalten, war aber im letzten nicht enthalten). Jeder Index konnte auch parallel gelöscht werden. Es ist auch notwendig, die automatische Reinigung zu lehren, um Parallelität zu verwenden.

P. S. , . . - , , .

Source: https://habr.com/ru/post/undefined/


All Articles