大規模テーブルに対する B-tree インデックスの構築は、ネイティブの単一プロセス方式では時間がかかります。Elastic Parallel Query (EPQ) は、インデックス作成におけるヒープスキャン段階を並列化し、大規模テーブルでの構築時間を約 5 倍短縮します。本トピックでは、EPQ の仕組み、設定するパラメーター、および PolarDB for PostgreSQL (Compatible with Oracle) で EPQ を使用して B-tree インデックスまたはグローバル B-tree インデックスを作成する手順について説明します。
仕組み
PolarDB for PostgreSQL (Compatible with Oracle) がインデックスを構築する際には、まずヒープテーブルをスキャンしてインデックスエントリを収集し、その後、それらのエントリから B-tree を構築します。
EPQ を有効化すると、データベースはクエリコーディネーター (QC) プロセスを起動し、ヒープテーブルを並列でスキャンします。インデックス構築プロセスは、この QC プロセスからスキャン結果を受け取り、インデックスを構築します。この並列スキャンにより、大規模テーブルにおけるインデックス作成時間が短縮されます。
制限事項
EPQ 加速によるインデックス作成は、一般カラムに対する B-tree インデックスにのみ適用されます。
CONCURRENTLY句およびINCLUDE句はサポートされていません。式カラムに対するインデックスはサポートされていません。
パラメーター
インデックス作成に EPQ を使用するには、以下のパラメーターを設定します。
| パラメーター | デフォルト値 | 説明 |
|---|---|---|
polar_px_enable_btbuild | off | EPQ 加速によるインデックス作成を有効化します。有効にするには on に設定します。 |
polar_px_dop_per_node | 1 | ノードごとの並列処理の次数 (DOP) を設定します。大規模テーブルの場合、8 または 16 を推奨します。このパラメーターは、EPQ 分析クエリの DOP も制御します。詳細については、「」をご参照ください。 |
polar_px_enable_replay_wait | (データベースのデフォルト値) | インデックスに最新のテーブルエントリが含まれることを保証します。polar_px_enable_btbuild を on に設定すると、このパラメーターは現在のセッションに対して自動的に有効化され、インデックス作成完了後にデータベースのデフォルト値に復元されます。 |
polar_bt_write_page_buffer_size | 0 | インデックス作成時の書き込み I/O ポリシーを制御します。単位はブロックです。最大値は 8192 です。最適なパフォーマンスを得るには 4096 を推奨します。 |
`polar_bt_write_page_buffer_size` の動作:
`0` (デフォルト): 各インデックスページが満杯になると、インデックスエントリをブロック単位でディスクにフラッシュします。
ゼロ以外の値: 指定サイズのカーネルバッファーにインデックスエントリをバッファリングします。バッファーが満杯になると、すべてのエントリが単一の I/O 操作でディスクにフラッシュされるため、I/O スケジューリングのオーバーヘッドが削減されます。これにより、インデックス作成時間は最大 20 % 短縮される可能性があります。
パラメーター間の依存関係:
polar_px_enable_btbuild=on を設定すると、現在のセッションに対して polar_px_enable_replay_wait が自動的に有効化されます。インデックス作成完了後、polar_px_enable_replay_wait はデータベースのデフォルト値に復元されます。
EPQ を使用した B-tree インデックスの作成
以下の手順では、サンプルテーブルを使用して EPQ の有効化および B-tree インデックスの作成方法を示します。
開始前に、以下の条件を満たしていることを確認してください:
PolarDB for PostgreSQL (Compatible with Oracle) のテーブル
サンプルテーブルの準備
test という名前のテーブルを作成します:
CREATE TABLE test(id int, id2 int);テーブル構造を確認します:
\d test期待される出力:
Table "public.test"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
id2 | integer | | |インデックスの作成
現在のセッションで EPQ 加速によるインデックス作成を有効化します:
SET polar_px_enable_btbuild = on;設定を確認します:
SHOW polar_px_enable_btbuild;期待される出力:
polar_px_enable_btbuild ------------------------- on (1 row)px_build=onオプションを指定してインデックスを作成します:CREATE INDEX t ON test(id) WITH (px_build=on);インデックスを確認します:
\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 を使用してインデックスが構築されたことを確認できます。
px_build=onオプションは、CREATE INDEX文で必須です。polar_px_enable_btbuildをonに設定しても、px_build=onオプションを省略した場合、PolarDB はネイティブのインデックス作成方式を使用します。この場合、インデックス定義にはpx_buildフィールドが表示されません:
CREATE INDEX t ON test(id);Indexes:
"t" btree (id)パフォーマンスデータ
EPQ を使用すると、大規模テーブルにおける B-tree インデックスの構築速度が、ネイティブ方式と比較して約 5 倍高速になります。
以下の図は、130 GB のデータセットを用いて、EPQ 有効化前後のグローバル B-tree インデックス作成パフォーマンスを比較したものです。
