it-swarm.com.de

Überwachung des Fortschritts der Indexerstellung in PostgreSQL

Gibt es eine Möglichkeit, den Fortschritt der Erstellung eines Index in PostgreSQL zu überwachen? Ich erstelle einen Index für eine große Tabelle und möchte sehen, wie schnell dies geschieht.

Gibt es eine Möglichkeit, dies zu überwachen?

40
myahya

Laut der Seite Postgres Wiki's Index Maintenance können Sie den aktuellen Status aller Ihrer Indizes ermitteln mit:

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;

Die Kolumne num_rows gibt an, wie viele Zeilen von Ihrem Index abgedeckt werden, und index_size wächst, während der Index erstellt wird.

23
databyte

Es gibt also keine gute Möglichkeit, dies zu tun, aber wenn Sie es wirklich wissen müssen ... berechnen Sie zuerst den Speicherplatz, den der Index einnehmen sollte, basierend auf der Datengröße * Zeilen + Overhead. Sie können dann etwas wie pfiles oder pgtruss verwenden, um die Dateien zu finden, die in $ PGDATA geschrieben werden. Wenn Ihre Indizes über 1 GB liegen, handelt es sich um eine Reihe von Dateien wie nnnnn.n, bei denen der erste Satz von n konsistent ist und die letzten n Inkremente für jede GB-Datei vorliegen. Sobald Sie wissen, wie viele Dateien erstellt wurden, können Sie das Wachstum beobachten und herausfinden, wie kurz Sie vor dem Abschluss stehen. Grobe Schätzung, aber vielleicht hilft es.

11
xzilla

Dies wird in der kommenden Version von PostgreSQL 12 möglich sein (sollte am 3. Oktober 2019 veröffentlicht werden).

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;

Siehe die Dokumente für die Ansicht pg_stat_progress_create_index und depesz 'Blog-Beitrag für Details.

8
Envek

Nein, gibt es nicht, auch wenn Sie es im CONCURRENT-Modus erstellen. Obwohl ich in der Vergangenheit die Größe der Datei im Datenbankverzeichnis im Auge behalten habe, ist dies nicht wirklich nützlich, da Sie nur raten können, wie groß sie sein wird.

4
araqnid