Surveiller l'avancement de la construction d'index dans PostgreSQL

36

Existe-t-il un moyen de surveiller l’avancement 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.

Y at-il un moyen de surveiller cela?

Myahya
la source
Si vous utilisez psql, vous devriez essayer \ timing
sftsz le

Réponses:

21

Selon la page Maintenance des index de Postgres Wiki , vous pouvez connaître 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_rowsindique le nombre de lignes couvertes par votre index et index_sizeaugmentera au fur et à mesure de la construction de l'index.

databyte
la source
8
Je suppose que cela peut ne pas fonctionner pour un nouvel index, qui peut ne pas être visible dans le catalogue jusqu'à ce que la transaction qui le crée soit validée.
Mustaccio
@mustaccio vous avez raison. Je crée un index qui prend beaucoup de temps et la commande ci-dessus n'affiche que les index déjà créés. il ne montrera pas les index où 'CREATE INDEX' est toujours en cours.
orange80
1
REINDEX TABLE bloque cette requête. Au moins, il l'a fait quand je l'ai exécuté sur 9.6.
RonJohn
10

Donc, il n’ya pas de bonne façon de le faire, mais si vous avez vraiment besoin de savoir ... calculez d’abord la quantité d’espace que devrait occuper l’index, en fonction de la taille des données * lignes + surcharge. Vous pouvez ensuite utiliser quelque chose comme pfiles ou pgtruss pour trouver les fichiers en cours d'écriture dans $ PGDATA; si vos index sont supérieurs à 1 Go, il s'agira d'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 de Go. Une fois que vous savez combien de fichiers sont créés, vous pouvez regarder la croissance et déterminer si vous êtes sur le point de terminer. Estimation approximative, mais peut-être que ça aide.

xzilla
la source
4

Non, même si vous le construisez en mode CONCURRENT. Bien que, dans le passé, je garde un œil sur la taille du fichier dans le répertoire de la base de données, cela n’est pas vraiment utile, car vous pouvez seulement deviner son importance.

araqnid
la source
3

Cela sera possible dans la prochaine version de PostgreSQL 12 (devrait être publié 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;

Consultez la documentation de la vue pg_stat_progress_create_index et le billet de blog de depesz pour plus de détails.

Envek
la source