PolarDB for PostgreSQL は、列ストアインデックスを有効にして使用するための 2 つの方法をサポートしています。コンソールで列ストアインデックス読み取り専用ノードを追加する方法と、列ストアインデックス拡張機能を直接使用する方法です。ビジネスシナリオに最も適した方法を選択できます。
適用範囲
クラスターのバージョン:
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.8.3.0 以降)
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.10.20.0 以降)
説明コンソールで、または
SHOW polardb_version;文を実行して、マイナーエンジンバージョン番号を表示できます。マイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードする必要があります。ソーステーブルにはプライマリキーが必要です。列ストアインデックスを作成するときは、プライマリキー列を含める必要があります。
wal_levelパラメーターをlogicalに設定する必要があります。これにより、論理レプリケーションをサポートするために必要な情報が先行書き込みログ (WAL) に追加されます。説明コンソールで wal_level パラメーターを設定できます。このパラメーターを変更すると、クラスターが再起動します。それに応じてビジネス運用を計画し、注意して進めてください。
制限事項
各テーブルに作成できる列ストアインデックスは 1 つだけです。
列ストアインデックスの変更はサポートされていません。列ストアインデックスに列を追加するには、インデックスを再作成する必要があります。
列ストアインデックス機能の有効化
列ストアインデックス機能を有効にする方法は、お使いの PolarDB for PostgreSQL クラスターのマイナーエンジンバージョンによって異なります。
列ストアインデックスの作成
1. 特定の列またはすべての列に対して列ストアインデックスを作成する
構文
-- 特定の列のインデックスを作成
CREATE INDEX [ CONCURRENTLY ] csi_index_name ON table_name USING CSI(column1,column2,...);
-- すべての列のインデックスを作成
CREATE INDEX [ CONCURRENTLY ] csi_index_name ON table_name USING CSI;パラメーター
パラメーター | 説明 |
CONCURRENTLY | オプション。インデックスを並行モードで作成します。これにより、ソーステーブルへの書き込み操作がブロックされず、既存のオンラインテーブルにインデックスを作成するのに適しています。 説明
|
csi_index_name | 列ストアインデックスのカスタム名。 |
table_name | 列ストアインデックスを作成するテーブルの名前。 |
column1,column2,... | 列ストアインデックスに含めるテーブルの特定の列。列を指定しない場合、すべての列に対してインデックスが作成されます。 |
例
salesという名前の基本的なテストテーブルを準備します。CREATE TABLE sales (sale_id int primary key, name CHAR(10), amount int);列ストアインデックスを作成します。テーブルごとに作成できる列ストアインデックスは 1 つだけなので、次のいずれかの文を実行して、指定したテーブルに列ストアインデックスを作成します。
特定の列の列ストアインデックスを作成する
CREATE INDEX idx_csi_sales ON sales USING CSI(sale_id, amount);すべての列の列ストアインデックスを作成する
CREATE INDEX idx_csi_sales ON sales USING CSI;並行モードで特定の列の列ストアインデックスを作成する
並行モードで列ストアインデックスを作成しても、ソーステーブルへの書き込み操作はブロックされません。この方法は、既存のオンラインテーブルにインデックスを作成するのに適しています。
CREATE INDEX CONCURRENTLY idx_csi_sales ON sales USING CSI(sale_id, amount);インデックスが作成されたら、次の文を実行してインデックス情報を表示できます。
SELECT * FROM pg_indexes WHERE tablename = 'sales';
2. インデックス作成の進捗状況の表示
大きなテーブルの列ストアインデックスの作成には時間がかかることがあります。次の方法で作成の進捗状況を確認できます。関連するパラメーターを調整して、作成速度を向上させることもできます。
SELECT * FROM pg_stat_progress_create_index;3. (オプション) インデックス作成のキャンセル
インデックスの作成に時間がかかり、プロセスが既存のサービスに影響を与える場合は、pg_cancel_backend または pg_terminate_backend を使用してインデックスの作成をキャンセルできます。これらの関数には pid が必要です。これは、「2. インデックス作成の進捗状況の表示」セクションの手順に従って取得できます。
SELECT pg_cancel_backend(pid);
SELECT pg_terminate_backend(pid);4. インデックスサイズの表示
pg_relation_size 関数を使用してインデックスサイズを表示します。pg_size_pretty 関数と組み合わせることで、サイズをより読みやすいフォーマットで表示できます。
SELECT * FROM pg_size_pretty(pg_relation_size('csi_index_name'));たとえば、以前に作成した列ストアインデックスのストレージサイズを表示できます。
SELECT * FROM pg_size_pretty(pg_relation_size('idx_csi_sales'));5. (オプション) 列ストアインデックスのリアルタイムデータの設定
PolarDB for PostgreSQL クラスターは、既存データに列ストアインデックスを作成し、行指向テーブルから列ストアインデックスに新しいデータを自動的に同期することをサポートしています。CREATE INDEX 文を使用してテーブルの列ストアインデックスを作成すると、新しいデータはリアルタイムで列ストアインデックスに書き込まれます。このプロセスに追加の操作は必要ありません。
特定のビジネスシナリオのリアルタイムデータ要件を満たすために、polar_csi.update_interval および polar_csi.update_batch_count パラメーターを調整して、列ストアインデックスのリアルタイムパフォーマンスを向上させることができます。
列ストアインデックスの使用
1. パラメーターの設定
列ストアインデックスを作成した後、次のパラメーターを使用して、SQL クエリが列ストアインデックスを使用するかどうかを制御できます。
パラメーター | 説明 |
| クエリが列ストアインデックスを使用できるかどうかを指定します。有効な値は次のとおりです。
|
| 列ストアインデックスを使用するためのクエリコストのしきい値。クエリコストが現在のしきい値より低い場合、ローストアエンジンが使用されます。それ以外の場合は、列ストアエンジンが使用されます。 説明 このパラメーターを 0 に設定すると、すべてのクエリが列ストアインデックスを優先的に使用します。本番環境で値を 0 に設定することはお勧めしません。ローストアエンジンと列ストアエンジンの負荷に基づいて、この値を動的に調整してください。 |
2. パラメーターのスコープの設定
グローバルスコープ
コンソールを使用して polar_csi.enable_query パラメーターを on に設定できます。これにより、すべてのデータベースのすべての検索文が列ストアインデックスの使用を試みることができます。
セッションレベル
セッション内のすべてのクエリは、列ストアインデックスの使用を試みます。
SET polar_csi.enable_query = ON;SQL 文レベル
セッション内の単一の SQL クエリは、ヒントを使用して列ストアインデックスを使用できます。
この機能は pg_hint_plan 拡張機能に依存します。この拡張機能をインストールするには、ターゲットデータベースで CREATE EXTENSION pg_hint_plan; を実行する必要があります。
polar_csi.enable_queryのみ設定します。-- クエリが列ストアインデックスを使用できるようにする /*+ SET (polar_csi.enable_query on) */ SELECT COUNT(*) FROM sales;polar_csi.enable_queryとpolar_csi.cost_thresholdを設定します。-- クエリが列ストアインデックスを使用できるようにし、クエリコストのしきい値を 0 に設定する /*+SET (polar_csi.enable_query on) SET(polar_csi.cost_threshold 0)*/ SELECT COUNT(*) FROM sales;
3. SQL 文が列ストアインデックスを使用しているかどうかの確認
EXPLAIN や EXPLAIN ANALYZE などのツールを使用して、クエリプランを出力できます。プランに CSI Executor キーワードが含まれている場合、クエリは列ストアインデックスを使用しています。
EXPLAIN SELECT COUNT(*) FROM sales;次の結果が返されます。
QUERY PLAN
--------------
CSI Executor
(1 row)4. (オプション) 列ストアインデックスのクエリ整合性レベルの設定
PolarDB for PostgreSQL の列ストアインデックスは、さまざまなビジネスニーズを満たすために 2 つのクエリ整合性レベルをサポートしています。
結果整合性 (デフォルト): 書き込み負荷は高いが、リアルタイムデータの要件が低いクエリに適しています。
強力な整合性: 列のストアのデータがローストアのデータと完全に一致した後にのみ、クエリ結果を返します。
PolarDB for PostgreSQL の列ストアインデックスのリアルタイムパフォーマンスは、サブ秒レベルに達することがあります。ただし、書き込み負荷が高い場合、列ストアインデックスのデータ遅延は増加します。デフォルトの整合性レベルは結果整合性です。したがって、書き込み負荷が高く、SQL クエリが列ストアインデックスを使用する場合、クエリは最新のデータを取得できない可能性があります。
ローストアと列ストア間の強力な整合性が必要なシナリオでは、polar_csi.forward_replay_wait パラメーターを強力な整合性読み取り (on) に設定できます。クエリが実行されると、システムは列ストアインデックスのデータがローストアのデータと一致した後にのみクエリを実行します。
列ストアインデックスの削除と再構築
PolarDB for PostgreSQL クラスターは列ストアインデックスの変更をサポートしていないため、既存の列ストアインデックスに他の列を追加するには、インデックスを削除して再作成するか、インデックスを再構築する必要があります。
列ストアインデックスの削除
構文
DROP INDEX csi_index_name;パラメーター
パラメーター | 説明 |
csi_index_name | 削除する列ストアインデックスの名前。 |
例
以前に作成した列ストアインデックスを削除します。
DROP INDEX idx_csi_sales; 列ストアインデックスの再構築
構文
REINDEX INDEX csi_index_name;パラメーター
パラメーター | 説明 |
csi_index_name | 再構築する列ストアインデックスの名前。 |
例
以前に作成した列ストアインデックスを再構築します。
REINDEX INDEX idx_csi_sales; パフォーマンス向上のための列ストアインデックスパラメーターのチューニング
インデックス作成速度の向上
インデックスの作成速度は、次の表に示すように、いくつかのパラメーターに関連しています。
パラメーター名 | 有効値 | デフォルト値 | 説明 |
polar_csi.memory_limit | 1~1048576 | 1024 | 列ストアインデックスが使用できるメモリ量 (MB)。 メモリのしきい値が大きいほど、インデックスの作成が速くなります。クラスターの仕様に基づいてこのパラメーターを調整してください。メモリ不足 (OOM) エラーのリスクを避けるため、この値をクラスターメモリの 20% を超えないように設定することをお勧めします。 |
polar_csi.flush_count | 2048~20480000 | 204800 | バッチコミットの行数。 行数を増やすと作成効率が向上しますが、より多くのメモリが必要になります。 |
列ストアインデックスのリアルタイムパフォーマンスの向上
PolarDB は、指定されたバージョンで次のパラメーターを追加しました。これらのパラメーターを調整することで、行から列への変換速度を向上させ、列ストアインデックスデータのリアルタイムパフォーマンスを向上させることができます。
PostgreSQL 14: マイナーエンジンバージョン 2.0.14.13.28.0 以降。
PostgreSQL 16: 関連するパラメーターはありません。
パラメーター名 | 有効値 | デフォルト値 | 関数 |
polar_csi.update_interval | 0~3600 | 3 | 定期的な更新の間隔 (秒)。 更新間隔を長くすると、同じタイプの小さなトランザクションをマージでき、トランザクション数が多い場合のデータ更新効率が向上します。 |
polar_csi.update_batch_count | 1024~4294967295 | 100000 | 一括更新の行数のしきい値。 これは、更新トランザクションの最大行数です。このしきい値を大きくすると、データ更新効率が向上します。 |
クエリ速度の向上
クエリのパフォーマンスは、主に次のパラメーターに関連しています。これらの値を調整して、クエリのパフォーマンスを向上させることができます。
パラメーター名 | 有効値 | デフォルト値 | 関数 |
polar_csi.exec_parallel | 1~512 | 2 | 列ストアインデックスによって実行される単一クエリの並列処理の次数。 一般に、並列処理の次数が高いほどパフォーマンスが向上します。これはクラスターのリソース仕様に関連しています。クラスターの仕様に基づいてこのパラメーターを調整してください。この値を計算ノードの CPU コア数より高く設定しないことをお勧めします。 |
polar_csi.memory_limit | 1~1048576 | 1024 | 列ストアインデックスが使用できるメモリ量 (MB)。 クラスターの仕様に基づいてこのパラメーターを調整してください。メモリ不足 (OOM) エラーのリスクを避けるため、この値をクラスターメモリの 20% を超えないように設定することをお勧めします。 |
polar_csi.cost_threshold | 1~1000000000 | 50000 | 列ストアインデックスを使用するためのクエリコストのしきい値。クエリコストが現在のしきい値より低い場合、ローストアエンジンが使用されます。それ以外の場合は、列ストアエンジンが使用されます。 このパラメーターを大きな値に設定すると、時間のかかる SQL 文が列ストアインデックスを使用しなくなり、クエリが遅くなる可能性があります。このパラメーターを小さな値に設定すると、単純な SQL 文が列ストアインデックスを使用する可能性があり、システムの同時実行性が低下します。実際のビジネス負荷に基づいてこのパラメーターを調整してください。 説明
|
polar_csi.forward_replay_wait | on|off | off | IMCI クエリの整合性レベル。有効な値は次のとおりです。
|





