Überwachung des Fortschritts der Indexerstellung in PostgreSQL

36

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?

Myahya
quelle
Wenn Sie psql verwenden, sollten Sie versuchen, \ timing
sftsz

Antworten:

21

Laut der Indexpflegeseite von Postgres Wiki können Sie den aktuellen Status aller Ihrer Indizes folgendermaßen ermitteln:

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 Spalte num_rowsgibt an, wie viele Zeilen von Ihrem Index abgedeckt werden, und index_sizewächst, wenn der Index erstellt wird.

Databyte
quelle
8
Ich vermute, dass dies für einen neuen Index möglicherweise nicht funktioniert. Dieser Index wird möglicherweise erst im Katalog angezeigt, wenn die Transaktion, die ihn erstellt, festgeschrieben wurde.
Mustaccio
@mustaccio du bist richtig. Ich erstelle einen Index, der sehr lange dauert, und der obige Befehl zeigt nur Indizes an, die bereits erstellt wurden. Es werden keine Indizes angezeigt, in denen 'CREATE INDEX' noch ausgeführt wird.
Orange80
1
REINDEX TABLE blockiert diese Abfrage. Zumindest war es so, als ich es am 9.6. Ausführte.
RonJohn
10

Es gibt also keine gute Möglichkeit, dies zu tun, aber wenn Sie es wirklich wissen müssen ... berechnen Sie zuerst den Platz, den der Index einnehmen soll, basierend auf der Datengröße * Zeilen + Overhead. Sie können dann so etwas wie pfiles oder pgtruss verwenden, um die Dateien zu finden, die in $ PGDATA geschrieben werden. Wenn Ihre Indizes größer als 1 GB sind, handelt es sich um eine Reihe von Dateien wie nnnnn.n, wobei der erste Satz von n konsistent ist und die letzten n Schritte für jede GB-Datei. Sobald Sie wissen, wie viele Dateien erstellt wurden, können Sie das Wachstum beobachten und herausfinden, wie nah Sie am Ende sind. Grobe Schätzung, aber vielleicht hilft es.

xzilla
quelle
4

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.

araqnid
quelle