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

PolarDB:列ストアインデックスの有効化と使用

最終更新日:Nov 09, 2025

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 クラスターのマイナーエンジンバージョンによって異なります。

PostgreSQL 16 (2.0.16.9.8.0 以降) または PostgreSQL 14 (2.0.14.17.35.0 以降)

これらのバージョンの PolarDB for PostgreSQL クラスターでは、2 つの方法が利用可能です。違いは次の表にまとめられています。ニーズに最も適した方法を選択できます。

比較項目

[推奨] 列ストアインデックス読み取り専用ノードの追加

プリインストール済みの列ストアインデックス拡張機能を直接使用

方法

コンソールのビジュアルインターフェイスを通じて、列ストアインデックスノードを手動で追加できます。

操作は不要です。拡張機能を直接使用できます。

リソース割り当て

列ストアエンジンはすべてのリソースを排他的に使用し、使用可能なメモリを最大限に活用できます。

列ストアエンジンはメモリの 25% しか使用できません。残りのメモリはローストアエンジンに割り当てられます。

ビジネスへの影響

トランザクション処理 (TP) と分析処理 (AP) のワークロードは、異なるノードで分離されており、互いに影響しません。

TP と AP のワークロードは同じノードで実行され、互いに影響します。

コスト

インメモリ列インデックス (IMCI) 読み取り専用ノードには追加料金が発生し、通常の計算ノードと同じレートで課金されます。

追加コストはかかりません。

列ストアインデックス読み取り専用ノードの追加

列ストアインデックス読み取り専用ノードは、次の 2 つの方法のいずれかで追加できます。

説明

クラスターには少なくとも 1 つの読み取り専用ノードが含まれている必要があります。単一ノードのクラスターに列ストアインデックス読み取り専用ノードを追加することはできません。

コンソールでの追加

  1. PolarDB コンソールにログインし、クラスターが配置されているリージョンを選択します。次のいずれかの方法で [ノードの追加/削除] ウィザードを開くことができます。

    • クラスター ページで、操作 列の ノードの追加/削除 をクリックします。

      image

    • ターゲットクラスターの 概要 ページで、データベースノード セクションの ノードの追加/削除 をクリックします。

      image

  2. [列ストアインデックス読み取り専用ノードの追加] を選択し、[OK] をクリックします。

  3. クラスターのスペックアップ/スペックダウンページで、列ストアインデックス読み取り専用ノードを追加し、支払いを完了します。

    1. [+列ストアインデックス読み取り専用ノードの追加] をクリックし、ノードの仕様を選択します。

    2. スイッチオーバー時間を選択します。

    3. (オプション) プロダクト利用規約とサービスレベル契約を確認します。

    4. [今すぐ購入] をクリックします。

    image

  4. 支払いが完了したら、クラスターの詳細ページに戻り、列ストアインデックス読み取り専用ノードが追加されるのを待ちます。ノードのステータスが [実行中] に変わると、ノードは追加されています。image

購入時の追加

PolarDB 購入ページで、[ノード数] パラメーターに [列ストアインデックス読み取り専用ノード] の数を選択します。

image

PostgreSQL 16 (2.0.16.8.3.0 から 2.0.16.9.8.0) または PostgreSQL 14 (2.0.14.10.20.0 から 2.0.14.17.35.0)

これらのバージョンの PolarDB for PostgreSQL クラスターでは、列ストアインデックスはデータベースクラスターに polar_csi 拡張機能としてデプロイされます。列ストアインデックスを使用する前に、指定したデータベースに拡張機能を作成する必要があります。

説明
  • polar_csi 拡張機能はデータベースレベルにスコープされます。クラスター内の複数のデータベースで列ストアインデックスを使用するには、各データベースに polar_csi 拡張機能を作成する必要があります。

  • 拡張機能のインストールに使用するデータベースアカウントは、特権アカウントである必要があります。

polar_csi 拡張機能は、次の 2 つの方法のいずれかでインストールできます。

コンソールからのインストール

  1. PolarDB コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。クラスターが配置されているリージョンを選択し、クラスター ID をクリックしてクラスターの詳細ページに移動します。

  2. 左側のナビゲーションウィンドウで、[設定と管理] > [拡張機能の管理] を選択します。[拡張機能の管理] タブで、[未インストールの拡張機能] を選択します。

  3. ページの右上隅で、ターゲットデータベースを選択します。polar_csi 拡張機能の行で、[アクション] 列の [インストール] をクリックします。表示される [拡張機能のインストール] ダイアログボックスで、ターゲットの [データベースアカウント] を選択し、[OK] をクリックしてターゲットデータベースに拡張機能をインストールします。

    image.png

コマンドラインからのインストール

データベースクラスターに接続し、polar_csi 拡張機能を作成するために必要な権限を持つターゲットデータベースで次の文を実行します。

CREATE EXTENSION polar_csi;

列ストアインデックスの作成

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

オプション。インデックスを並行モードで作成します。これにより、ソーステーブルへの書き込み操作がブロックされず、既存のオンラインテーブルにインデックスを作成するのに適しています。

説明
  • このパラメーターをサポートするのは、マイナーエンジンバージョンが 2.0.14.13.27.0 以降の PostgreSQL 14 を実行するクラスターのみです。マイナーエンジンバージョンの要件が満たされていない場合は、マイナーエンジンバージョンをアップグレードしてください。

  • CONCURRENTLY の実装は、論理レプリケーションスロット機能に依存しており、この機能はマイナーエンジンバージョン 2.0.14.13.27.0 以降のクラスターではデフォルトで有効になっています。古いバージョンを使用している場合は、polar_csi プラグインを再インストールするか、弊社までお問い合わせください。

  • CONCURRENTLY を使用してインデックスを作成すると、同時操作をサポートするための一時的な論理レプリケーションスロットが作成されます。データ同期が完了すると、一時的な論理レプリケーションスロットは自動的に解放されます。

csi_index_name

列ストアインデックスのカスタム名。

table_name

列ストアインデックスを作成するテーブルの名前。

column1,column2,...

列ストアインデックスに含めるテーブルの特定の列。列を指定しない場合、すべての列に対してインデックスが作成されます。

  1. sales という名前の基本的なテストテーブルを準備します。

    CREATE TABLE sales (sale_id int primary key, name CHAR(10), amount int);
  2. 列ストアインデックスを作成します。テーブルごとに作成できる列ストアインデックスは 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 クエリが列ストアインデックスを使用するかどうかを制御できます。

パラメーター

説明

polar_csi.enable_query

クエリが列ストアインデックスを使用できるかどうかを指定します。有効な値は次のとおりです。

  • off (デフォルト): クエリは列ストアインデックスを使用できません。

  • on: クエリは列ストアインデックスを使用できます。

SET polar_csi.enable_query = on;

polar_csi.cost_threshold

列ストアインデックスを使用するためのクエリコストのしきい値。クエリコストが現在のしきい値より低い場合、ローストアエンジンが使用されます。それ以外の場合は、列ストアエンジンが使用されます。

SET polar_csi.cost_threshold = 0;
説明

このパラメーターを 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_querypolar_csi.cost_threshold を設定します。

    -- クエリが列ストアインデックスを使用できるようにし、クエリコストのしきい値を 0 に設定する
    /*+SET (polar_csi.enable_query on) SET(polar_csi.cost_threshold 0)*/  SELECT COUNT(*) FROM sales;

3. SQL 文が列ストアインデックスを使用しているかどうかの確認

EXPLAINEXPLAIN 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 文が列ストアインデックスを使用する可能性があり、システムの同時実行性が低下します。実際のビジネス負荷に基づいてこのパラメーターを調整してください。

説明
  • PostgreSQL 14 では、このパラメーターのデフォルト値はマイナーエンジンバージョン 2.0.14.13.28.0 以降で 50000 に変更されました。以前のデフォルト値は 1000 でした。

  • PostgreSQL 16 の場合、デフォルト値は 1000 です。

polar_csi.forward_replay_wait

on|off

off

IMCI クエリの整合性レベル。有効な値は次のとおりです。

  • off: 結果整合性。列ストアインデックスのデータは、ローストアより遅れる可能性があります。

  • on: 強力な整合性。クエリは、列ストアデータが最新の状態に再生されるまで待ってから実行されます。書き込みプレッシャーが高い場合、このパラメーターを有効にすると、待機時間が長くなる可能性があります。