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?


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.


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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.