PostgreSQLでのインデックス構築の進行状況の監視


36

PostgreSQLのインデックス作成の進行状況を監視する方法はありますか。私は大きなテーブルにインデックスを作成していますが、これがどのくらいの速さで起こっているのかを見たいです。

これを監視する方法はありますか?


psqlを使用している場合は、\ timing
sftsz

回答:


21

Postgres Wikiのインデックスメンテナンスページによると、次の方法ですべてのインデックスの現在の状態を確認できます。

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あなたは正しいです。時間がかかるインデックスを作成していますが、上記のコマンドは既に作成されたインデックスのみを表示します。「CREATE INDEX」がまだ進行中のインデックスは表示されません。
orange80

1
REINDEX TABLEはこのクエリをブロックします。少なくとも、9.6で実行したときはそうでした。
ロンジョン

10

そのため、良い方法はありませんが、本当に知る必要がある場合は、まずデータサイズ*行+オーバーヘッドに基づいて、インデックスに必要なスペースの量を計算します。次に、pfilesやpgtrussなどを使用して、$ PGDATA内に書き込まれているファイルを見つけることができます。インデックスが1GBを超える場合は、nnnnn.nのような一連のファイルになります。nnnnの最初のセットは一貫しており、最後のnは各GBファイルごとに増加します。作成されたファイルの数がわかれば、成長を監視し、どれだけ終了するかを把握できます。おおよその見積もりですが、おそらく役立つでしょう。


4

いいえ、CONCURRENTモードでビルドしていてもありません。過去にはデータベースディレクトリ内のファイルのサイズに注目していましたが、どれだけの大きさになるかしか推測できないため、これはあまり役に立ちません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.