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

PolarDB:インメモリー列指向インデックス (IMCI) の有効化と使用

最終更新日:Jul 08, 2026

インメモリー列指向インデックス (IMCI) 機能は、 および PolarDB for PostgreSQL (Compatible with Oracle) では、2 つの方法で有効化し、使用できます。IMCI 読み取り専用ノードを追加する方法と、事前インストール済みの拡張を使用する方法があります。ニーズに最適な方法を選択してください。

前提条件

  • クラスターのバージョン:

    Oracle 構文互換性 2.0 (マイナーエンジンバージョン 2.0.14.10.20.0 以降)

    説明

    コンソールで、または SHOW polardb_version; ステートメントを実行してマイナーエンジンバージョンを確認できます。マイナーエンジンバージョンが要件を満たさない場合は、マイナーエンジンバージョンをアップグレードしてください。

  • wal_level パラメーターを logical に設定する必要があります。この設定は、ロジカルデコーディングに必要な情報を先行書き込みログ (WAL) に追加します。

    説明

    コンソールでwal_level パラメーターを設定することができます。このパラメーターを変更するとクラスターが再起動されるため、ビジネスへの影響を考慮し、慎重に操作を行ってください。

  • ソーステーブルにはプライマリキーが必要で、列ストアインデックスの作成時にはそのプライマリキー列を含める必要があります。プライマリキーに SERIAL または BIGSERIAL データ型を使用すると、データ同期の効率が大幅に向上するため、推奨します。

  • 各テーブルに作成できる列ストアインデックスは 1 つだけです。

IMCI 機能の有効化

IMCI を有効化する方法は、 または PolarDB for PostgreSQL (Compatible with Oracle) クラスターのマイナーエンジンバージョンによって異なります。

Oracle 構文互換性2.0 (2.0.14.17.35.0 以降)

これらのバージョンの または PolarDB for PostgreSQL (Compatible with Oracle) クラスターでは、2 つの方法が利用できます。以下の表に違いを示します。

比較項目

[推奨] IMCI 読み取り専用ノードの追加

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

方法

コンソールで IMCI 読み取り専用ノードを手動で追加できます。

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

リソース割り当て

列ストアエンジンは、利用可能なすべてのメモリを含むノードのリソースを専有します。

列ストアエンジンはノードメモリの 25% に制限されます。残りのメモリはローストアエンジンに割り当てられます。

業務への影響

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

TP と AP のワークロードは同じノード上で実行され、互いに影響する可能性があります。

コスト

IMCI 読み取り専用ノードには追加料金がかかり、通常のコンピューティングノードと同じ料金で課金されます。

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

IMCI 読み取り専用ノードの追加

IMCI 読み取り専用ノードを追加するには、2 つの方法があります。

説明

クラスターには少なくとも 1 つの読み取り専用ノードが必要です。単一ノードクラスターに IMCI 読み取り専用ノードを追加することはできません。

コンソール

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

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

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

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

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

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

    2. 切り替え時間を選択します。

    3. (オプション) 製品利用規約とサービスレベルアグリーメント (SLA) を確認します。

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

  4. 支払いが完了したら、クラスター詳細ページに戻り、IMCI 読み取り専用ノードが追加されるのを待ちます。ノードは、そのステータスが実行中に変わると使用可能になります。

購入時

PolarDB 購入ページで、ノード数 セクションで、[IMCI 読み取り専用ノード] の数を指定します。

Oracle 構文互換性2.0 (2.0.14.10.20.0 から 2.0.14.17.35.0 未満)

これらのバージョンの または PolarDB for PostgreSQL (Compatible with Oracle) クラスターでは、IMCI 機能は polar_csi 拡張機能として提供されています。IMCI を使用するには、まず対象のデータベースに拡張機能を作成する必要があります。

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

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

polar_csi 拡張機能をインストールするには、2 つの方法があります。

コンソール

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

  2. 左側のナビゲーションペインで、設定と管理 > プラグインの管理 を選択します。プラグインの管理 タブで、プラグインがインストールされていません を選択します。

  3. ページの右上隅で、ターゲットデータベースを選択します。 polar_csi 拡張機能の行で、操作列の インストール をクリックします。 プラグインのインストール ダイアログボックスで、ターゲットの データベースアカウント を選択し、確認 をクリックしてターゲットデータベースに拡張機能をインストールします。

CLI

データベースクラスターに接続し、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 以降で Oracle 構文互換性 2.0 を実行するクラスターでのみサポートされています。 マイナーエンジンバージョンの要件が満たされていない場合は、マイナーエンジンバージョンをアップグレードしてください。

  • 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 (Compatible with Oracle) クラスターは、履歴データに対する列ストアインデックスの作成をサポートするだけでなく、ローストアテーブルから列ストアインデックスへの新しいデータの自動同期もサポートします。CREATE INDEX 文を使用してテーブルに列ストアインデックスを作成すると、新しいデータがリアルタイムで列ストアインデックスに書き込まれ、追加の操作は不要です。

IMCI は または PolarDB for PostgreSQL (Compatible with Oracle) の論理レプリケーションメカニズムを使用し、WAL ログをデコードして変更を列ストアエンジンに適用することでデータを同期します。デフォルト設定では、このメカニズムは約 200,000 QPS の書き込みスループットを処理できます (Sysbench oltp_insert 標準テストに基づく)。

  • 現在のデータ同期レイテンシーの確認

    SELECT active_pid, database, slot_name, pg_size_pretty(pg_current_wal_lsn() - confirmed_flush_lsn) AS size FROM pg_replication_slots WHERE slot_name LIKE 'csi_sync_%';

    size が 50 MB 以内に収まっている場合、列ストアデータは通常数秒以内に更新されます。

  • データ同期効率の向上

    特定のビジネスシナリオにおける行ストアおよび列ストアデータのリアルタイム要件を満たすには、polar_csi.update_interval および polar_csi.update_batch_count パラメーターを調整して カラムストアインデックスのリアルタイムパフォーマンスを向上させることができます。

インメモリー列指向インデックスの使用

1. パラメーターの設定

列ストアインデックスを作成した後、次のパラメーターを使用して、SQL クエリが列ストアインデックスを使用するかどうかを制御できます。

パラメーター

説明

polar_csi.enable_query

クエリで IMCI を使用できるかどうかを指定します。有効な値:

  • off (デフォルト):クエリで IMCI を使用できません。

  • on:クエリで IMCI を使用できます。

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 クエリは、ヒントを使用して列ストアインデックスを使用できます。

説明

この機能は 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. インデックス使用の確認

EXPLAIN または EXPLAIN ANALYZE を使用して、実行計画を表示できます。実行計画に CSI Executor キーワードが含まれている場合、クエリがカラムストアインデックスを使用したことを示します。

EXPLAIN SELECT COUNT(*) FROM sales;

次の結果が返されます。

  QUERY PLAN  
--------------
 CSI Executor
(1 row)

4. (オプション) インメモリー列指向インデックスクエリの整合性設定

および PolarDB for PostgreSQL (Compatible with Oracle) は、さまざまなビジネスニーズに対応するために、2つのクエリ整合性レベルを提供します。

  • 結果整合性 (デフォルト): 書き込み負荷が高く、リアルタイムデータ要件が低いワークロードに適しています。

  • 強い整合性: 列ストア内のデータが行ストア内のデータと完全に整合した後にのみ、クエリ結果が返されることを保証します。

および PolarDB for PostgreSQL (Compatible with Oracle) のレイテンシーは通常、数秒単位です。ただし、書き込み負荷が高い場合、データのレイテンシーは増加します。デフォルトの整合性レベルは結果整合性です。そのため、書き込み負荷が高く、SQL クエリが列ストアインデックスを使用する場合、クエリは最新のデータを取得できない可能性があります。

行ストアデータと列ストアデータ間の強い整合性が必要なビジネスシナリオでは、polar_csi.forward_replay_wait パラメーターon に設定できます。これにより、強い整合性読み取りが可能になります。クエリが実行されると、実行前に列ストアインデックスデータが行ストアデータと整合性がとれるまで待機します。

列ストアインデックスの削除と再作成

および PolarDB for PostgreSQL (Compatible with Oracle) では、列ストアインデックスの変更はサポートされていません。インデックスに列を追加するには、インデックスを削除してから再作成する必要があります。

インデックスの削除

構文

DROP INDEX csi_index_name;

パラメーター

パラメーター

説明

csi_index_name

削除する列ストアインデックスの名前。

作成済みのカラムストアインデックスを削除します。

DROP INDEX idx_csi_sales;

インデックスの再作成

構文

CREATE INDEX csi_index_name ON table_name USING columnar (column_name[, ...]);

パラメーター

パラメーター

説明

csi_index_name

作成する列ストアインデックスの名前。

以前に作成したカラムストアインデックスを再構築します。

CREATE INDEX idx_csi_sales ON sales USING columnar(sale_id, product_id, quantity);

IMCI パラメーターのチューニング

インデックス作成速度の向上

インデックス作成速度は、次のパラメーターによって決まります。

パラメーター

値の範囲

デフォルト

説明

polar_csi.memory_limit

1~1048576

4096

IMCI が使用できるメモリサイズです。単位:MB。

メモリのしきい値を大きくすると、インデックス作成が高速化されます。クラスターの仕様に基づいて値を調整してください。クラスターのメモリの 25% を超える値は設定しないことを推奨します。超えると、メモリ不足 (OOM) エラーが発生する可能性があります。

説明

Oracle 構文互換性 2.0: マイナーエンジンバージョン 2.0.14.19.40.0 以降では、このパラメーターのデフォルト値は 4096 に変更されています。以前のバージョンでは、デフォルト値は 1024 でした。

polar_csi.flush_count

2048~20480000

204800

インデックス作成時に、バッチごとにコミットする行数です。

行数を増やすと作成効率は向上しますが、より多くのメモリが必要になります。

リアルタイム性能の向上

以下のパラメーターを調整することで、行から列への変換の速度を上げ、カラムストアインデックスデータのリアルタイム性能を向上させることができます。

パラメーター

値の範囲

デフォルト

説明

polar_csi.update_interval

0~3600

1

行列データのリアルタイムパフォーマンスが定期的に更新される間隔。単位: 秒。

更新間隔を長くすると、同じ種類の小さなトランザクションをマージできるため、トランザクション数が多い場合にデータ更新効率が向上します。

説明

Oracle 構文互換性 2.0:マイナーエンジンバージョン 2.0.14.13.28.0 以降では、IMCI のリアルタイムパフォーマンスを向上させるためにこのパラメーターが追加されています。

polar_csi.update_batch_count

1024~4294967295

100000

バッチで更新する行数のしきい値です。

単一の更新トランザクションにおける最大行数です。このしきい値を増やすと、データ更新効率が向上します。

説明

Oracle 構文互換性 2.0: マイナーエンジンバージョン 2.0.14.13.28.0 以降では、IMCI のリアルタイム性能を向上させるためにこのパラメーターが追加されました。

クエリ速度の向上

クエリ性能は、主に次のパラメーターによって決まります。これらの値を調整して、クエリ性能を向上させることができます。

パラメーター

値の範囲

デフォルト

説明

polar_csi.exec_parallel

1~512

2

IMCI の並列度、つまり単一の SQL ステートメントが使用できる CPU リソースを指定します。一般に、並列度が高いほどパフォーマンスが向上します。

実際の値は、クラスターのリソース仕様によって異なります。クラスターの仕様に基づいて値を調整してください。コンピューティングノードの CPU コア数を超える値は設定しないことを推奨します。

polar_csi.memory_limit

1~1048576

4096

IMCI が使用できるメモリサイズです。単位:MB。

メモリのしきい値を大きくすると、インデックス作成が高速化されます。クラスターの仕様に基づいて値を調整してください。クラスターのメモリの 25% を超える値は設定しないことを推奨します。超えると、メモリ不足 (OOM) エラーが発生する可能性があります。

説明

Oracle 構文互換性 2.0: マイナーエンジンバージョン 2.0.14.19.40.0 以降では、このパラメーターのデフォルト値は 4096 に変更されています。以前のバージョンでは、デフォルト値は 1024 でした。

polar_csi.cost_threshold

1~1000000000

50000

クエリのコストがこのしきい値を下回る場合、クエリでは IMCI による高速化は行われません。実際の値は、ビジネスのワークロードに基づいて調整してください。

  • 値が大きすぎると、時間のかかる SQL ステートメントで IMCI を使用できず、クエリが遅くなります。

  • 値が小さすぎると、単純な SQL ステートメントでも IMCI が使用され、システムの同時実行性が低下します。

説明
  • EXPLAIN または EXPLAIN ANALYZE を使用して、SQL ステートメントのコストを照会および分析できます。

  • Oracle 構文互換 2.0:マイナーエンジンバージョン 2.0.14.13.28.0 以降では、このパラメーターのデフォルト値は 50000 に変更されています。これより前のバージョンでは、デフォルト値は 1000 でした。

polar_csi.forward_replay_wait

on|off

off

IMCIIMCI データクエリの整合性レベル。有効な値:

  • off:結果整合性。IMCI データが行ストアデータより遅れる場合があります。

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