it-swarm-eu.dev

Sledování vývoje konstrukce indexu v PostgreSQL

Existuje způsob, jak sledovat postup vytváření indexu v PostgreSQL. Vytvářím index na velké tabulce a rád bych viděl, jak rychle se to děje.

Existuje způsob, jak to sledovat?

40
myahya

Podle stránky Údržba indexu Postgres Wiki můžete zjistit aktuální stav všech vašich indexů 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;

Sloupec num_rows označuje, kolik řádků je pokryto vaším indexem, a index_size poroste s vytvářením indexu.

23
databyte

Neexistuje tedy žádný dobrý způsob, jak to udělat, ale pokud opravdu potřebujete vědět ... nejprve vypočítejte velikost místa, které by index měl zabrat, na základě velikosti dat * řádků + režie. Pak můžete použít něco jako pfiles nebo pgtruss k nalezení souborů, které jsou zapsány uvnitř $ PGDATA; Pokud jsou vaše indexy vyšší než 1 GB, bude to řada souborů, jako je nnnnn.n, kde je první sada n shodná a poslední n se zvyšuje pro každý GB soubor. Jakmile víte, kolik souborů je vytvořeno, můžete sledovat růst a zjistit, jak blízko jste k dokončení. Hrubý odhad, ale možná to pomůže.

11
xzilla

Bude to možné v nadcházejícím vydání PostgreSQL 12 (mělo by být vydáno 3. října 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;

Viz dokumenty pro zobrazení pg_stat_progress_create_index a blogový příspěvek depesz pro podrobnosti.

8
Envek

Ne, není, i když ji stavíte v běžném režimu. Přestože jsem v minulosti sledoval velikost souboru v adresáři databáze, není to opravdu užitečné, protože můžete jen hádat, jak velký bude.

4
araqnid