PostgreSQL에서 인덱스 생성 진행 상황 모니터링


35

PostgreSQL에서 인덱스 생성 진행 상황을 모니터링하는 방법이 있습니까? 큰 테이블에 인덱스를 만들고 있는데 이것이 얼마나 빨리 발생하는지 알고 싶습니다.

이것을 모니터링하는 방법이 있습니까?


psql을 사용한다면, \ timing
sftsz를

답변:


21

Postgres Wiki의 Index Maintenance 페이지 에 따르면 다음을 통해 모든 인덱스의 현재 상태를 확인할 수 있습니다.

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;

이 열 num_rows은 색인에 포함 된 행 수를 나타내며 index_size색인이 작성 될 때 증가합니다.


8
인덱스에서는 이것이 작동 하지 않을 수 있으며 인덱스를 만드는 트랜잭션이 커밋 될 때까지 카탈로그에 표시되지 않을 수 있습니다.
mustaccio

@mustaccio 당신이 맞습니다. 시간이 오래 걸리는 색인을 작성 중이며 위 명령은 이미 작성된 색인 만 표시합니다. 'CREATE INDEX'가 아직 진행중인 인덱스는 표시되지 않습니다.
orange80

1
REINDEX TABLE은이 쿼리를 차단합니다. 적어도 9.6에서 실행했을 때였습니다.
RonJohn

10

따라서 좋은 방법 은 없지만 실제로 알아야 할 경우 먼저 데이터 크기 * 행 + 오버 헤드를 기준으로 인덱스가 차지하는 공간의 양을 계산하십시오. 그런 다음 pfiles 또는 pgtruss와 같은 것을 사용하여 $ PGDATA 내에 기록중인 파일을 찾을 수 있습니다. 인덱스가 1GB를 초과하면 nnnnn.n과 같은 일련의 파일이됩니다. 여기서 n의 첫 번째 세트는 일관되며 각 GB 파일의 마지막 n은 증가합니다. 생성 된 파일 수를 알고 나면 증가를보고 마무리에 얼마나 근접했는지 파악할 수 있습니다. 대략적인 추정이지만 도움이 될 수 있습니다.


4

아니요, 동시 모드로 빌드하더라도 없습니다. 과거에는 데이터베이스 디렉토리에있는 파일의 크기에주의를 기울 였지만, 이것이 얼마나 큰지 짐작할 수 있기 때문에 이것은 실제로 유용하지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.