すべてのプロダクト
Search
ドキュメントセンター

PolarDB:Elastic Parallel Query を使用したインデックス作成の高速化

最終更新日:Mar 29, 2026

大規模なテーブルに B-tree インデックスを作成するには、かなりの時間がかかり、メンテナンスウィンドウを妨げ、スキーマ移行を遅らせる可能性があります。Elastic Parallel Query (EPQ) は、インデックス作成中のヒープテーブルスキャンを並列化し、構築時間をネイティブのシリアル方式の約 5 分の 1 に短縮します。

仕組み

EPQ を使用しない場合、PolarDB for PostgreSQL (Compatible with Oracle) はヒープテーブルを順次スキャンしてインデックスエントリを構築し、それらのエントリから B-tree を構築します。

EPQ を有効にすると、クエリコーディネーター (QC) プロセスが、ヒープスキャンを複数のパラレルワーカーに分散します。各ワーカーはテーブルのパーティションをスキャンし、結果をインデックス作成プロセスに転送します。インデックス作成プロセスは、最終的な B-tree を構築します。

制限事項

制限事項詳細
列の型EPQ は、通常の列でのインデックス作成のみを高速化します。式列はサポートされていません。
構文EPQ では CONCURRENTLY オプションと INCLUDE オプションはサポートされていません。

パラメーター

EPQ を使用してインデックスを作成する前に、次のパラメーターを設定します。

パラメーターデフォルト推奨値説明
polar_px_enable_btbuildoffonEPQ によるインデックス作成の高速化を有効にします。
polar_px_dop_per_node18 または 16ノードあたりの並列度 (DOP) です。の DOP も制御します。
polar_px_enable_replay_wait(auto)polar_px_enable_btbuild=on の場合、現在のセッションで自動的にアクティブ化されます。最新のテーブルエントリがインデックス付けされることを保証します。インデックス作成が完了すると、データベースのデフォルト値にリセットされます。
polar_bt_write_page_buffer_size04096インデックス作成中の書き込み I/O の動作を制御します。単位:ブロック。最大値:8192。これを 4096 に設定すると、インデックス作成時間が最大 20% 短縮されます。

polar_bt_write_page_buffer_size の動作

  • `0` (デフォルト): 各インデックスページがいっぱいになると、インデックスエントリをブロックごとにディスクにフラッシュします。

  • ゼロ以外の値: 指定されたサイズのカーネルバッファにインデックスエントリをバッファリングし、バッファがいっぱいになると一度にすべてをフラッシュすることで、頻繁な I/O スケジューリングのオーバーヘッドを削減します。

EPQ を使用した B-tree インデックスの作成

前提条件

開始する前に、次のものがあることを確認してください。

  • PolarDB for PostgreSQL (Compatible with Oracle) クラスター

  • ターゲットテーブルで DDL 文を実行する権限

操作手順

次の例では、test という名前のテーブルを作成し、EPQ を使用してインデックスを構築します。

1. テストテーブルの作成

CREATE TABLE test(id int, id2 int);

テーブルスキーマを確認します。

\d test

期待される出力:

               Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
 id2    | integer |           |          |

2. EPQ によるインデックス作成の高速化の有効化

SET polar_px_enable_btbuild=on;

設定を確認します。

SHOW polar_px_enable_btbuild;

期待される出力:

 polar_px_enable_btbuild
-------------------------
 on
(1 row)

3. インデックスの作成

このビルドで EPQ を使用するには、CREATE INDEX 文に WITH (px_build=on) を追加します。

CREATE INDEX t ON test(id) WITH(px_build=on);
polar_px_enable_btbuild=on だけでは、特定のインデックスビルドに対して EPQ はアクティブ化されません。CREATE INDEX 文に WITH (px_build=on) を含める必要があります。これがない場合、PolarDB はネイティブ (シリアル) のインデックス作成方法を使用し、作成されたインデックスには px_build アノテーションは表示されません。

4. EPQ を使用してインデックスが作成されたことの確認

\d test

期待される出力:

               Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
 id2    | integer |           |          |
Indexes:
    "t" btree (id) WITH (px_build=finish)

(px_build=finish) フィールドは、EPQ が使用されたことを示します。

パフォーマンスデータ

EPQ は、大規模なテーブルのインデックスをネイティブ方式より約 5 倍速く作成します。

次の図は、130 GB のデータを使用して、EPQ を有効にする前と後のグローバルインデックス作成のパフォーマンスを比較したものです。

Performance comparison

次のステップ