sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL12での進捗レポートの機能強化

    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コマンド

    システムカタログ

    サポートされているPostgreSQLバージョン

    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の操作フェーズ

      初期化 ビルド前にライターを待っています 建物のインデックス 検証前にライターを待っています
    1. インデックスの検証:インデックスのスキャン
    2. インデックスの検証:タプルの並べ替え
    3. インデックス検証:スキャンテーブル
    4. 古いスナップショットを待っています デッドマークを付ける前に読者を待っています ドロップする前に読者を待っています

    例:

    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のドキュメントをご覧ください。


    1. PostgreSQLのSlonyレプリケーションに関するエキスパートガイド

    2. データベースの精度を向上させる方法

    3. データベース駆動型Webサイトについて知っておくべきこと

    4. AccessでSQLServerを使用する必要があるのはいつですか。 (ヒント:ほとんどの場合)