Monitorando o progresso da construção de índices no PostgreSQL

36

Existe uma maneira de monitorar o progresso da criação de um índice no PostgreSQL. Estou criando um índice em uma tabela grande e gostaria de ver com que rapidez isso está ocorrendo.

Existe uma maneira de monitorar isso?

myahya
fonte
se você estiver usando psql, você deve tentar \ tempo
sftsz

Respostas:

21

De acordo com a página de Manutenção de Índice do Postgres Wiki , você pode descobrir o estado atual de todos os seus índices com:

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;

A coluna num_rowsindica quantas linhas são cobertas pelo seu índice e index_sizeaumentam à medida que o índice está sendo criado.

databyte
fonte
8
Eu suspeito que isso pode não funcionar para um novo índice, que pode não estar visível no catálogo até que a transação que o cria seja confirmada.
mustaccio 23/01
@mustaccio você está correto. estou criando um índice que está demorando muito tempo, e o comando acima mostra apenas índices que já foram criados; não mostrará índices onde 'CREATE INDEX' ainda está em andamento.
precisa saber é o seguinte
1
REINDEX TABLE bloqueia esta consulta. Pelo menos, aconteceu quando eu o executei na 9.6.
RonJohn
10

Portanto, não há uma boa maneira de fazer isso, mas se você realmente precisa saber ... primeiro calcule a quantidade de espaço que o índice deve ocupar, com base no tamanho dos dados * linhas + sobrecarga. Você pode usar algo como pfiles ou pgtruss para encontrar os arquivos que estão sendo gravados dentro de $ PGDATA; se seus índices tiverem mais de 1 GB, haverá uma série de arquivos como nnnnn.n, em que o primeiro conjunto de n é consistente e o último n é incrementado para cada arquivo em GB. Depois de saber quantos arquivos são criados, você pode observar o crescimento e descobrir o quão perto está de terminar. Estimativa aproximada, mas talvez isso ajude.

xzilla
fonte
4

Não, não há, mesmo se você estiver construindo no modo CONCURRENTE. Embora no passado eu tenha ficado de olho no tamanho do arquivo no diretório do banco de dados, isso não é realmente útil, pois você pode apenas imaginar o tamanho dele.

araqnid
fonte
3

Isso será possível na próxima versão do PostgreSQL 12 (deve ser lançada em 3 de outubro de 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;

Consulte os documentos da visualização pg_stat_progress_create_index e da postagem no blog de depesz para obter detalhes.

Envek
fonte