PostgreSQL 13: VIDE parallèle

L'autre jour, Amit Kapila a commis un patch Masahiko Sawada, qui permet un nettoyage en parallèle. La table elle-même est toujours effacée par un processus (principal), mais pour nettoyer les index, elle peut désormais démarrer des workflows en arrière-plan, un pour chaque index. En mode manuel, cela vous permet d'accélérer le nettoyage de grandes tables avec plusieurs index; le nettoyage automatique n'utilise pas encore cette fonction.

Liens connexes:


Comme vous le savez , le processus de nettoyage des tables comprend plusieurs phases.

Tout d'abord, la table est analysée et les liens vers les versions inutiles ("mortes") des lignes sont collectés en mémoire. La mémoire est limitée par le paramètre maintenance_work_mem , donc tous les liens peuvent ne pas correspondre à la fois.

Ensuite, tous les index sont triés séquentiellement (comme c'était le cas auparavant) et les pointeurs vers les versions mortes trouvées des chaînes sont supprimés d'eux.

Ensuite, la partie déjà affichée du tableau est à nouveau analysée et les versions mortes des lignes sont déjà supprimées.

Si à un moment donné, il n'était pas possible de traiter toutes les versions mortes des chaînes, la mémoire est effacée et l'ensemble du processus est répété à partir de l'endroit où nous nous sommes arrêtés la dernière fois.

L'ensemble de ce schéma reste inchangé, mais maintenant les index peuvent être effacés en parallèle. Pour ce faire, le processus principal démarre plusieurs workflows qui analysent les index existants et les traitent. Un index est traité par un seul processus. Une fois tous les index effacés, les workflows sont terminés et le facilitateur passe à la phase suivante.

Par exemple, prenez la ticket_flights table de vol de la base de données . Il y a un index dessus, mais vous pouvez en créer quelques autres.

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

Seuls les index dont la taille dépasse la valeur du paramètre min_parallel_index_scan_size sont impliqués dans le traitement parallèle . Nos indices conviennent:

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)

Mettez à jour la moitié des lignes pour charger le travail de nettoyage:

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

Aller.

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

On peut voir que le processus directeur a lancé deux travailleurs et pris un indice.

Le nombre de processus de travail peut être spécifié explicitement (dans tous les cas, bien sûr, il ne dépassera pas max_parallel_maintenance_workers , ce qui ne dépassera pas max_worker_processes ). Une indication explicite peut notamment être utilisée pour désactiver la simultanéité:

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

J'espère que ce sujet sera développé davantage. La table pouvait être scannée en parallèle par plusieurs processus (c'était dans le patch Savada d'origine, mais pas inclus dans le dernier), chaque index pouvait également être effacé en parallèle. Il est également nécessaire d'apprendre au nettoyage automatique à utiliser le parallélisme.

P. S. , . . - , , .

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


All Articles