大規模なテーブルに 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_btbuild | off | on | EPQ によるインデックス作成の高速化を有効にします。 |
polar_px_dop_per_node | 1 | 8 または 16 | ノードあたりの並列度 (DOP) です。の DOP も制御します。 |
polar_px_enable_replay_wait | (auto) | — | polar_px_enable_btbuild=on の場合、現在のセッションで自動的にアクティブ化されます。最新のテーブルエントリがインデックス付けされることを保証します。インデックス作成が完了すると、データベースのデフォルト値にリセットされます。 |
polar_bt_write_page_buffer_size | 0 | 4096 | インデックス作成中の書き込み 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 を有効にする前と後のグローバルインデックス作成のパフォーマンスを比較したものです。
