Monitorowanie postępu konstrukcji indeksu w PostgreSQL

36

Czy istnieje sposób monitorowania postępu tworzenia indeksu w PostgreSQL. Tworzę indeks na dużym stole i chciałbym zobaczyć, jak szybko to się dzieje.

Czy istnieje sposób na monitorowanie tego?

myahya
źródło
jeśli używasz psql, powinieneś spróbować \ timing
sftsz

Odpowiedzi:

21

Zgodnie ze stroną utrzymania indeksu Postgres Wiki , możesz sprawdzić aktualny stan wszystkich swoich indeksów za pomocą:

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;

Kolumna num_rowswskazuje liczbę wierszy objętych indeksem i index_sizebędzie rosła w miarę budowania indeksu.

databajt
źródło
8
Podejrzewam, że to może nie działać w przypadku nowego indeksu, który może nie być widoczny w katalogu, dopóki transakcja, która go tworzy, nie zostanie zatwierdzona.
mustaccio
@mustaccio masz rację. tworzę indeks, który zajmuje dużo czasu, a powyższe polecenie pokazuje tylko indeksy, które już zostały utworzone; nie będzie pokazywał indeksów, w których „CREATE INDEX” jest nadal w toku.
orange80
1
Tabela REINDEX blokuje to zapytanie. Przynajmniej tak się stało, kiedy uruchomiłem go na 9.6.
RonJohn
10

Tak więc nie ma dobrego sposobu, aby to zrobić, ale jeśli naprawdę musisz wiedzieć ... najpierw obliczyć ilość miejsca, jaką powinien zająć indeks, na podstawie rozmiaru danych * wierszy + narzutu. Następnie możesz użyć czegoś takiego jak pfiles lub pgtruss, aby znaleźć pliki, które są zapisywane w $ PGDATA; jeśli indeksy przekraczają 1 GB, będzie to seria plików takich jak nnnnn.n, w której pierwszy zestaw n jest spójny, a ostatnie n przyrostów dla każdego pliku GB. Gdy dowiesz się, ile plików zostało utworzonych, możesz obserwować wzrost i dowiedzieć się, jak blisko jesteś ukończenia. Szacunkowe przybliżenie, ale może to pomaga.

Xzilla
źródło
4

Nie, nie ma, nawet jeśli budujesz go w trybie KONKURENCYJNYM. Chociaż w przeszłości miałem oko na rozmiar pliku w katalogu bazy danych, nie jest to tak naprawdę przydatne, ponieważ można tylko zgadywać, jak duży będzie.

araqnid
źródło
3

Będzie to możliwe w nadchodzącym wydaniu PostgreSQL 12 (powinno zostać wydane 3 października 2019 r.).

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;

Zobacz dokumentację widoku pg_stat_progress_create_index i post na blogu depesz, aby uzyskać szczegółowe informacje.

Envek
źródło