Existe-t-il un moyen de suivre la progression de la création d'un index dans PostgreSQL. Je crée un index sur une grande table et j'aimerais voir à quelle vitesse cela se produit.
Existe-t-il un moyen de surveiller cela?
Selon la page Maintenance de l'index de Postgres Wiki , vous pouvez trouver l'état actuel de tous vos index avec:
SELECT
t.tablename,
indexname,
c.reltuples AS num_rows,
pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size,
pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size,
CASE WHEN indisunique THEN 'Y'
ELSE 'N'
END AS UNIQUE,
idx_scan AS number_of_scans,
idx_tup_read AS tuples_read,
idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
JOIN pg_class c ON c.oid = x.indrelid
JOIN pg_class ipg ON ipg.oid = x.indexrelid
JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
AS foo
ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
ORDER BY 1,2;
La colonne num_rows
indique le nombre de lignes couvertes par votre index et index_size
augmentera au fur et à mesure de la construction de l'index.
Donc, il n'y a pas bon moyen de le faire, mais si vous avez vraiment besoin de savoir ... calculez d'abord la quantité d'espace que l'index devrait prendre, en fonction de la taille des données * lignes + frais généraux. Vous pouvez ensuite utiliser quelque chose comme pfiles ou pgtruss pour trouver les fichiers en cours d'écriture dans $ PGDATA; si vos index dépassent 1 Go, ce sera une série de fichiers comme nnnnn.n, où le premier ensemble de n est cohérent et les n derniers incréments pour chaque fichier GB. Une fois que vous savez combien de fichiers sont créés, vous pouvez observer la croissance et déterminer à quel point vous êtes proche de terminer. Estimation approximative, mais peut-être que cela aide.
Cela sera possible dans la prochaine version de PostgreSQL 12 (devrait être publiée le 3 octobre 2019).
SELECT
now()::TIME(0),
a.query,
p.phase,
p.blocks_total,
p.blocks_done,
p.tuples_total,
p.tuples_done
FROM pg_stat_progress_create_index p
JOIN pg_stat_activity a ON p.pid = a.pid;
Voir la documentation de la vue pg_stat_progress_create_index et article de blog de depesz pour plus de détails.
Non, il n'y en a pas, même si vous le construisez en mode CONCURRENT. Bien que dans le passé, j'aie gardé un œil sur la taille du fichier dans le répertoire de la base de données, ce n'est pas vraiment utile car vous ne pouvez que deviner sa taille.