インメモリー列指向インデックス (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) クラスターのマイナーエンジンバージョンによって異なります。
列ストアインデックスの作成
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 (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 を使用できるかどうかを指定します。有効な値:
|
|
polar_csi.cost_threshold |
クエリの推定コストがこのしきい値を超えると、オプティマイザは列ストアエンジンを選択します。そうでない場合は、行ストアエンジンを使用します。
説明
このパラメーターを 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_queryとpolar_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 による高速化は行われません。実際の値は、ビジネスのワークロードに基づいて調整してください。
説明
|
|
polar_csi.forward_replay_wait |
on|off |
off |
IMCIIMCI データクエリの整合性レベル。有効な値:
|