pg_repackの実装と活用

pg_repackは IBM Cloud® Databases for PostgreSQL、テーブルロックを必要とせずにテーブルとインデックスをオンラインで再編成する関数を提供する拡張です。 その主な機能は、テーブルサイズを縮小し、肥大化を排除してパフォーマンスを向上させることである。

PostgreSQL、テーブルの行が更新されたり削除されたりして、再利用されない領域が残ると、通常、肥大化が発生する。 時間が経つにつれて、テーブルが必要以上にディスクスペースを占有するようになり、ディスクI/Oとメモリ使用量の増加によるパフォーマンス低下につながる可能性がある。

pg_repack は PostgreSQL バージョン > 9.5 でサポートされています。

以下のクエリを実行して、拡張機能を有効にする:

CREATE EXTENSION pg_repack;

要件

  1. テーブルのPRIMARY KEYまたはNOT NULL UNIQUE制約の存在は必須である。
  2. 現在のサイズの2倍に相当する追加ディスク容量が必要。

テーブル・サイズを確認するには、以下のクエリーを使用する:

SELECT schemaname as schemaname,
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM
    pg_catalog.pg_statio_user_tables where relname='<tablename>';
  1. クライアント上のpg_repackはサーバ上のpg_repackと互換性がある必要があります。

インストールされている拡張機能とそのバージョンを表示するには、次のクエリーを使用します:

SELECT extname AS extension_name,
       extversion AS version,
       nspname AS schema
FROM pg_extension
JOIN pg_namespace ON pg_namespace.oid = pg_extension.extnamespace
ORDER BY extname;

pgrepackの使い方

希望するオプションを指定してpg_repackを実行するには、以下の構文を使用する:

 pg_repack -k [OPTION]... [DBNAME]

  • -k オプションは、問題が発生した場合に元のテーブルを保持するようにpg_repackに指示します。

  • [DBNAMEを] PostgreSQL データベース名に置き換える。

  • 一般的なオプションは以下の通り:

    • -t 特定のテーブルを対象とする
    • -U ユーザーを指定する
    • -h と でホストとポートを指定する。 -p

pg_repack拡張をインストールし、テーブルに主キーまたはNULLでない一意制約があることを確認した後、以下のようにテーブルをリパックすることができます:

eg:
exampledb=> create table test(id int);
CREATE TABLE
exampledb=> create table test1(id int PRIMARY KEY, name text);
CREATE TABLE
exampledb=>
exampledb=> CREATE EXTENSION pg_repack;
CREATE EXTENSION
exampledb=>
exampledb=>
exampledb=> SELECT extname AS extension_name,
       extversion AS version,
       nspname AS schema
FROM pg_extension
JOIN pg_namespace ON pg_namespace.oid = pg_extension.extnamespace
ORDER BY extname;
 extension_name | version |    schema
----------------+---------+---------------
 pg_repack      | 1.5.1   | ibm_extension
 plpgsql        | 1.0     | pg_catalog
(2 rows)

----
pg_repack -k --host=localhost --dbname=exampledb --port=31273 --username=test_admin
INFO: repacking table "public.test1"