PostgreSQLでは、多くのDDLコマンドの実行に非常に長い時間がかかる場合があります。 PostgreSQLには、コマンド実行中にDDLコマンドの進行状況を報告する機能があります。 PostgreSQL 9.6以降、専用のシステムカタログ(pg_stat_progress_vacuumと呼ばれる)を使用して、手動VACUUMおよびautovacuumの実行の進行状況を監視することが可能になりました。
PostgreSQL 12には、CLUSTER、VACUUM FULL、CREATE INDEX、REINDEXなどのいくつかのコマンドの進行状況を監視するためのサポートが追加されました。
現在、進捗レポート機能は、以下のコマンドでのみ使用できます。
- VACUUMコマンド
- CLUSTERコマンド
- VACUUMFULLコマンド
- CREATEINDEXコマンド
- REINDEXコマンド
PostgreSQLの進捗レポート機能が重要なのはなぜですか?
この機能は、操作が終了するのをやみくもに待たないようにすることができるため、長時間実行される操作を行う場合にオペレーターにとって非常に重要です。
これは、次のような洞察を得るための非常に便利な機能です。
進捗レポート機能は、パフォーマンスワークロード分析を行う場合にも役立ちます。これは、負荷パターンに応じてシステムレベルのパラメーターまたはリレーションレベルを調整するためのVACUUMジョブ処理の評価にも役立ちます。
DDLコマンド | | |
VACUUM | pg_stat_progress_vacuum | 9.6 |
VACUUM FULL | pg_stat_progress_cluster | 12 |
| pg_stat_progress_cluster | 12 |
| pg_stat_progress_create_index | 12 |
REINDEX | pg_stat_progress_create_index | 12 |
VACUUMコマンドの進行状況を監視する方法
VACUUMコマンドが実行されているときは常に、pg_stat_progress_vacuumビューには、現在バキュームしているバックエンド(autovacuumワーカープロセスを含む)ごとに1つの行が含まれます。 VACUUMコマンドとVACCUMFULLコマンドの実行の進行状況を確認するビューは、両方のコマンドの操作フェーズが異なるため、異なります。
VACUUMコマンドの操作フェーズ
このビューは、次の情報を提供するPostgreSQL12で使用できます。
postgres=# \d pg_stat_progress_vacuum ;
View "pg_catalog.pg_stat_progress_vacuum"
Column | Type | Collation | Nullable | Default
--------------------+---------+-----------+----------+---------
pid | integer | | |
datid | oid | | |
datname | name | | |
relid | oid | | |
phase | text | | |
heap_blks_total | bigint | | |
heap_blks_scanned | bigint | | |
heap_blks_vacuumed | bigint | | |
index_vacuum_count | bigint | | |
max_dead_tuples | bigint | | |
num_dead_tuples | bigint | | |
例:
postgres=# create table test ( a int, b varchar(40), c timestamp );
CREATE TABLE
postgres=# insert into test ( a, b, c ) select aa, bb, cc from generate_series(1,10000000) aa, md5(aa::varchar) bb, now() cc;
INSERT 0 10000000
postgres=# DELETE FROM test WHERE mod(a,6) = 0;
DELETE 1666666
セッション1:
postgres=# vacuum verbose test;
[. . . waits for completion . . .]
セッション2:
postgres=# select * from pg_stat_progress_vacuum;
-[ RECORD 1 ]------+--------------
pid | 22800
datid | 14187
datname | postgres
relid | 16388
phase | scanning heap
heap_blks_total | 93458
heap_blks_scanned | 80068
heap_blks_vacuumed | 80067
index_vacuum_count | 0
max_dead_tuples | 291
num_dead_tuples | 18
CLUSTERおよびVACUUMFULLの進捗レポート
CLUSTERコマンドとVACUUMFULLコマンドは、リレーションの書き換えに同じコードパスを使用するため、ビューpg_stat_progress_clusterを使用して両方のコマンドの進行状況を確認できます。
このビューはPostgreSQL12で使用でき、次の情報が表示されます。
postgres=# \d pg_stat_progress_cluster
View "pg_catalog.pg_stat_progress_cluster"
Column | Type | Collation | Nullable | Default
---------------------+---------+-----------+----------+---------
pid | integer | | |
datid | oid | | |
datname | name | | |
relid | oid | | |
command | text | | |
phase | text | | |
cluster_index_relid | bigint | | |
heap_tuples_scanned | bigint | | |
heap_tuples_written | bigint | | |
heap_blks_total | bigint | | |
heap_blks_scanned | bigint | | |
index_rebuild_count | bigint | | |
CLUSTERコマンドの操作フェーズ
例:
postgres=# create table test as select a,md5(a::text) as txt, now() as date from generate_series(1,3000000) a;
SELECT 3000000
postgres=# create index idx1 on test(a);
CREATE INDEX
postgres=# create index idx2 on test(txt);
CREATE INDEX
postgres=# create index idx3 on test(date);
CREATE INDEX
Now execute the CLUSTER table command and see the progress in pg_stat_progress_cluster.
セッション1:
postgres=# cluster verbose test using idx1;
[. . . waits for completion . . .]
セッション2:
postgres=# select * from pg_stat_progress_cluster;
pid | datid | datname | relid | command | phase | cluster_index_relid | heap_tuples_scanned | heap_tuples_written | heap_blks_total | heap_blks_scanned | index_rebuild_count
------+-------+----------+-------+---------+------------------+---------------------+---------------------+---------------------+-----------------+-------------------+---------------------
1273 | 13586 | postgres | 15672 | CLUSTER | rebuilding index | 15680 | 3000000 | 3000000 | 0 | 0 | 2
(1 row)
CREATEINDEXおよびREINDEXの進捗レポート
CREATE INDEXまたはREINDEXコマンドが実行されているときは常に、pg_stat_progress_create_indexビューには、現在インデックスを作成しているバックエンドごとに1つの行が含まれます。進行状況レポート機能を使用すると、CREATEINDEXおよびREINDEXのCONCURRENTLYフレーバーも追跡できます。 CREATE INDEXコマンドとREINDEXコマンドの内部実行フェーズは同じであるため、同じビューを使用して両方のコマンドの進行状況を確認できます。
postgres=# \d pg_stat_progress_create_index
View "pg_catalog.pg_stat_progress_create_index"
Column | Type | Collation | Nullable | Default
--------------------+---------+-----------+----------+---------
pid | integer | | |
datid | oid | | |
datname | name | | |
relid | oid | | |
phase | text | | |
lockers_total | bigint | | |
lockers_done | bigint | | |
current_locker_pid | bigint | | |
blocks_total | bigint | | |
blocks_done | bigint | | |
tuples_total | bigint | | |
tuples_done | bigint | | |
partitions_total | bigint | | |
partitions_done | bigint | | |
CREATE INDEX/REINDEXの操作フェーズ
- インデックスの検証:インデックスのスキャン
- インデックスの検証:タプルの並べ替え
- インデックス検証:スキャンテーブル
例:
postgres=# create table test ( a int, b varchar(40), c timestamp );
CREATE TABLE
postgres=# insert into test ( a, b, c ) select aa, bb, cc from generate_series(1,10000000) aa, md5(aa::varchar) bb, now() cc;
INSERT 0 10000000
postgres=# CREATE INDEX idx ON test (b);
CREATE INDEX
セッション1:
postgres=# CREATE INDEX idx ON test (b);
[. . . waits for completion . . .]
セッション2:
postgres=# SELECT * FROM pg_stat_progress_create_index;
-[ RECORD 1 ]------+-------------------------------
pid | 19432
datid | 14187
datname | postgres
relid | 16405
index_relid | 0
command | CREATE INDEX
phase | building index: scanning table
lockers_total | 0
lockers_done | 0
current_locker_pid | 0
blocks_total | 93458
blocks_done | 46047
tuples_total | 0
tuples_done | 0
partitions_total | 0
partitions_done | 0
postgres=# SELECT * FROM pg_stat_progress_create_index;
-[ RECORD 1 ]------+---------------------------------------
pid | 19432
datid | 14187
datname | postgres
relid | 16405
index_relid | 0
command | CREATE INDEX
phase | building index: loading tuples in tree
lockers_total | 0
lockers_done | 0
current_locker_pid | 0
blocks_total | 0
blocks_done | 0
tuples_total | 10000000
tuples_done | 4346240
partitions_total | 0
partitions_done | 0
PostgreSQLバージョン9.6以降には、コマンド実行中に特定のコマンドの進行状況を報告する機能があります。これは、DBA、開発者、およびユーザーにとって、長時間実行されるコマンドの進行状況を確認するための非常に優れた機能です。このレポート機能は、将来、他のいくつかのコマンドに拡張される可能性があります。この新機能の詳細については、PostgreSQLのドキュメントをご覧ください。