【JPUG主催】PostgreSQLカンファレンス2020【11月13日開催】
他のバージョンの文書 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

27.4. 進捗状況のレポート

PostgreSQLは、何らかのコマンドの実行中に進捗状況をレポートする能力があります。 現在、進捗状況のレポートをサポートしているのは、CREATE INDEXVACUUM、および、CLUSTERのみです。 将来的にサポートされるコマンドが拡大される可能性があります。

27.4.1. CREATE INDEX進捗状況のレポート

CREATE INDEXREINDEXが実行中であるときにはいつでも、pg_stat_progress_create_indexビューには現在インデックスを作成している各バックエンドごとの行が含まれます。

表27.22 pg_stat_progress_create_indexビュー

説明
pidintegerバックエンドのプロセスID。
datidoidこのバックエンドが接続されているデータベースのOID。
datnamenameこのバックエンドが接続されているデータベース名。
relidoidインデックスが作られているテーブルのOID。
index_relidoid 作成または再作成されているインデックスのOID。 同時作成ではないCREATE INDEXのときは、これは0です。
commandtext 実行しているコマンドで、 CREATE INDEXCREATE INDEX CONCURRENTLYREINDEXまたはREINDEX CONCURRENTLYです。
phasetext 現在処理中のインデックス作成のフェーズです。 表 27.23を参照してください。
lockers_totalbigint 該当するときに、待機するロック取得者の総数。
lockers_donebigint 既に待機したロック取得者の数。
current_locker_pidbigint 現在待機しているロック取得者のプロセスID。
blocks_totalbigint 現在のフェーズで処理されることになっているブロックの総数。
blocks_donebigint 現在のフェーズで既に処理されたブロック数。
tuples_totalbigint 現在のフェーズで処理されることになっているタプルの総数。
tuples_donebigint 現在のフェーズで既に処理されたタプル数。
partitions_totalbigint パーティションテーブル上のインデックスを作成するとき、この列にはインデックスが作られることになっているパーティションの総数が設定されます。
partitions_donebigint パーティションテーブル上のインデックスを作成するとき、この列にはインデックス作成が既に完了しているパーティションの数が設定されます。

表27.23 CREATE INDEX Phases

フェーズ説明
initializing CREATE INDEXREINDEXはインデックスを作る準備をしています。 このフェーズはごく短時間になると予想されます。
waiting for writers before build CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLYは、潜在的にテーブルを参照するかもしれない書き込みロックを伴うトランザクションが終了するのを待機しています。 本フェーズは同時モードでないときには省かれます。 列lockers_totallockers_done、および、current_locker_pidには本フェーズの進行情報が入ります。
building index インデックスがアクセスメソッド固有のコードにより作成されています。 本フェーズでは、進捗レポートをサポートするアクセスメソッドが自身の進捗データを記入し、また、サブフェーズはこの列で示されます。 典型的には、blocks_totalblocks_doneが、さらにあるいはtuples_totaltuples_doneも、進捗データを含みます。
waiting for writers before validation CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLYは、潜在的にテーブルに書き込みするかもしれない書き込みロックを伴うトランザクションが終了するのを待機しています。 本フェーズは同時モードでないときには省かれます。 列lockers_totallockers_done、および、current_locker_pidには本フェーズの進行情報が入ります。
index validation: scanning index CREATE INDEX CONCURRENTLYは確認が必要なタプルに対するインデックス検索をスキャンしています。 本フェーズは同時モードでないときには省かれます。 列blocks_total(インデックスの総サイズが設定される)とblocks_doneに本フェーズの進行情報が入ります。
index validation: sorting tuples CREATE INDEX CONCURRENTLYはインデックスをスキャンするフェーズ(scanning index)の出力をソートしています。
index validation: scanning table CREATE INDEX CONCURRENTLYは、前の2フェーズで収集されたインデックスのタプルを確認するためテーブルをスキャンしています。 本フェーズは同時モードでないときには省かれます。 列blocks_total(テーブルの総サイズが設定される)とblocks_doneに本フェーズの進行情報が入ります。
waiting for old snapshots CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLYは、潜在的にテーブルを参照するかもしれないトランザクションがそれらのスナップショットを解放するのを待機しています。 本フェーズは同時モードでないときには省かれます。 列lockers_totallockers_done、および、current_locker_pidには本フェーズの進行情報が入ります。
waiting for readers before marking dead REINDEX CONCURRENTLYは、古いインデックスに無効と印付けする前に、テーブルへの読み取りロックを伴うトランザクションが終了するのを待機しています。 本フェーズは同時モードでないときには省かれます。 列lockers_totallockers_done、および、current_locker_pidには本フェーズの進行情報が入ります。
waiting for readers before dropping REINDEX CONCURRENTLYは、古いインデックスを削除する前に、テーブルへの読み取りロックを伴うトランザクションが終了するのを待機しています。 本フェーズは同時モードでないときには省かれます。 列lockers_totallockers_done、および、current_locker_pidには本フェーズの進行情報が入ります。

27.4.2. VACUUM進捗状況のレポート

VACUUMを実行するときはいつでも、pg_stat_progress_vacuumビューは、現在バキューム処理している(自動バキュームワーカプロセスを含む)それぞれのバックエンドごとに1行を格納します。 その情報を説明している以下のテーブルにおいて、何がレポートされ、どのように解釈するかについての情報を提供します。 VACUUM FULLコマンドの進捗はpg_stat_progress_clusterでレポートされます。これは、通常のVACUUMはテーブル内を書き換えするのみである一方、VACUUM FULLCLUSTERはいずれもテーブルを再作成するためです。 27.4.3を参照してください。

表27.24 pg_stat_progress_vacuumビュー

説明
pidintegerバックエンドのプロセスID。
datidoidこのバックエンドが接続されたデータベースのOID。
datnamenameこのバックエンドが接続されたデータベース名。
relidoidバキューム処理が行われているテーブルのOID。
phasetext 現在のバキュームの処理フェーズ。表 27.25を参照してください。
heap_blks_totalbigint テーブルのヒープブロックの総数。 この数字は、スキャンの開始を基点としてレポートされます。 後に追加されるブロックは、このVACUUMによって処理されません(必要もありません)。
heap_blks_scannedbigint スキャンされたヒープブロックの数。 可視性マップがスキャンを最適化するために使用されるため、いくつかのブロックが検査されずに読み飛ばされます。 読み飛ばされたブロックはこの総数に含まれ、そのためこの数字はバキューム処理が完了した時に、最終的にheap_blks_totalと同じになります。 このカウンタは、フェーズがscanning heapの時にのみ増加します。
heap_blks_vacuumedbigint バキューム処理されたヒープブロックの数。 テーブルにインデックスが1つでも存在するなら、このカウンタはフェーズがvacuuming heapの時にのみ増加します。 無効なタプルが含まれていないブロックは読み飛ばされ、それゆえカウンタは時々大きな増加量で早送りされます。
index_vacuum_countbigint 完了したインデックスバキュームサイクルの数。
max_dead_tuplesbigint インデックスバキュームサイクルの実行に必要となる前に格納することが出来る、maintenance_work_memに基づいた、無効なタプルの数。
num_dead_tuplesbigint 最後のインデックスバキュームサイクルから収集された無効タプルの数。

表27.25 VACUUMのフェーズ

フェーズ説明
initializing VACUUMは、ヒープをスキャンし始める準備をしています。 このフェーズは、非常に短時間であると予想されます。
scanning heap VACUUMは、現在ヒープをスキャン中です。 必要であればそれぞれのページを切り取り、デフラグし、場合によってはフリーズ活動を実行します。 スキャンの進捗状況の監視にheap_blks_scanned列が使用できます。
vacuuming indexes VACUUMは、現在インデックスをバキューム処理中です。 テーブルにインデックスが存在する場合、ヒープが完全にスキャンされた後に、バキューム実行ごとに少なくとも1回発生します。 maintenance_work_memが、発見された無効タプルの数量を格納するのに不十分な場合は、バキューム実行ごとに複数回発生する可能性があります。
vacuuming heap VACUUMは、現在ヒープをバキューム処理中です。 ヒープのバキュームは、ヒープのスキャンと異なり、インデックスをバキューム処理するそれぞれのインスタンスの後に発生します。 heap_blks_scannedheap_blks_totalより少ない場合、システムはこのフェーズの完了後にヒープのスキャン処理に戻ります。 さもなければ、このフェーズの完了後にインデックスの整理を始めます。
cleaning up indexes VACUUMは、現在インデックスの整理処理中です。 これは、ヒープが完全にスキャンされ、インデックスとヒープが完全にすべてバキューム処理された後に発生します。
truncating heap VACUUMは、現在リレーションの終点の空のページをオペレーティングシステムに戻すためにヒープを削除しています。 これは、インデックスの整理処理後に発生します。
performing final cleanup VACUUMは、最終クリーンアップ処理をしています。 このフェーズの間、VACUUM空き領域マップをバキュームし、pg_classの統計情報を更新し、統計情報コレクタに統計情報を報告します。 このフェーズが完了した時、VACUUMは終了します。

27.4.3. CLUSTER進捗状況のレポート

CLUSTERVACUUM FULLが実行されているときにはいつでも、pg_stat_progress_clusterビューには現在いずれかのコマンドを実行している各バックエンドごとの行が含まれます。 以下の表は、報告される情報を説明し、どのように解釈するかの情報を提供します。

表27.26 pg_stat_progress_clusterビュー

説明
pidintegerバックエンドのプロセスID。
datidoidバックエンドが接続されているデータベースのOID。
datnamenameバックエンドが接続されているデータベース名。
relidoidクラスタ化されているテーブルのOID。
commandtext 実行しているコマンド。 CLUSTERVACUUM FULLのいずれかです。
phasetext 現在処理中のフェーズ。 表 27.27を参照してください。
cluster_index_relidoid テーブルがインデックスを使ってスキャンされているのであれば、これは使われているインデックスのOIDで、さもなくばゼロです。
heap_tuples_scannedbigint スキャンされたヒープタプルの数。 このカウンタは、フェーズがseq scanning heapindex scanning heap、または、writing new heapであるときのみ前進します。
heap_tuples_writtenbigint 書かれたヒープタプルの数。 このカウンタは、フェーズがseq scanning heapindex scanning heap、または、writing new heapであるときのみ前進します。
heap_blks_totalbigint テーブル内のヒープブロックの総数。 この数にはseq scanning heapの開始時の値が報告されます。
heap_blks_scannedbigint スキャンされたヒープブロックの数。 このカウンタは、フェーズがseq scanning heapであるときのみ前進します。
index_rebuild_countbigint インデックス再作成の数。 このカウンタはフェーズがrebuilding indexであるときのみ前進します。

表27.27 CLUSTERとVACUUM FULLのフェーズ

フェーズ説明
initializing コマンドはヒープのスキャンを開始する準備をしています。 本フェーズはごく短時間になると予想されます。
seq scanning heap コマンドは現在、テーブルをシーケンシャルスキャンを使ってスキャンしています。
index scanning heap CLUSTERは現在、インデックススキャンを使ってテーブルをスキャンしています。
sorting tuples CLUSTERは現在、タプルをソートしています。
writing new heap CLUSTERが新しいヒープに書き込んでいます。
swapping relation files コマンドは現在、新たに構築したファイルを置き換えて設置しています。
rebuilding index コマンドは現在、インデックスを再構築しています。
performing final cleanup コマンドは現在、最終クリーンアップを実行中です。 このフェーズが完了すると、CLUSTERVACUUM FULLは終了します。