Monitoreo del progreso de la construcción de índices en PostgreSQL

36

¿Hay alguna manera de monitorear el progreso de la creación de un índice en PostgreSQL? Estoy creando un índice en una tabla grande y me gustaría ver qué tan rápido está ocurriendo esto.

¿Hay alguna manera de monitorear esto?

myahya
fuente
si está utilizando psql, debe intentar \ timing
sftsz

Respuestas:

21

De acuerdo con la página de Mantenimiento del Índice de Postgres Wiki , puede averiguar el estado actual de todos sus índices con:

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;

La columna num_rowsindica cuántas filas está cubierto por su índice y index_sizecrecerá a medida que se va creando el índice.

databyte
fuente
8
Sospecho que esto puede no funcionar para un nuevo índice, que puede no estar visible en el catálogo hasta que se confirme la transacción que lo crea.
mustaccio
@mustaccio tienes razón. Estoy creando un índice que lleva mucho tiempo, y el comando anterior solo muestra índices que ya se han creado; no mostrará índices donde 'CREAR ÍNDICE' todavía está en progreso.
orange80
1
REINDEX TABLE bloquea esta consulta. Al menos, lo hizo cuando lo ejecuté en 9.6.
RonJohn
10

Por lo tanto, no hay una buena manera de hacerlo, pero si realmente necesita saber ... primero calcule la cantidad de espacio que debe tomar el índice, en función del tamaño de los datos * filas + sobrecarga. Luego puede usar algo como pfiles o pgtruss para encontrar los archivos que se escriben dentro de $ PGDATA; Si sus índices superan 1 GB, será una serie de archivos como nnnnn.n, donde el primer conjunto de n es coherente y el último n se incrementa para cada archivo GB. Una vez que sepa cuántos archivos se crean, puede ver el crecimiento y determinar qué tan cerca está de terminar. Estimación aproximada, pero tal vez ayuda.

xzilla
fuente
4

No, no lo hay, incluso si lo está construyendo en modo CONCURRENTE. Aunque en el pasado he observado el tamaño del archivo en el directorio de la base de datos, esto no es realmente útil, ya que solo puede adivinar qué tan grande será.

araqnid
fuente