このトピックでは、複雑なクエリをより効率的に処理するための、PolarDB for PostgreSQL (Compatible with Oracle) のインメモリ列指向インデックス (IMCI) 機能について説明します。
概要
PolarDB for PostgreSQL (Compatible with Oracle) の IMCI 機能を使用すると、単一のシステムで、高い同時実行性が求められるオンライン トランザクション処理 (OLTP) と複雑なデータ分析 (OLAP) の両方を処理できます。分析クエリのために、別の高価でアーキテクチャが複雑な外部システムを保守する必要はありません。これにより、データアーキテクチャが簡素化され、運用保守 (O&M) コストが削減され、大量のビジネスデータをリアルタイムに分析できます。
行指向ストレージエンジンと比較して、IMCI 機能は次の 2 つの領域でクエリ性能を向上させます。ストレージレイヤーの IMCI と、実行エンジンレイヤーのベクトル化演算子 (ベクトル化実行エンジンとも呼ばれます) です。これらの改善により、複雑なクエリ処理における行指向ストレージエンジンの制約を効果的に解消します。100 GB のデータセットと 32 コア、256 GB のクラスターを使用した TPC-H 性能テストでは、PolarDB for PostgreSQL (Compatible with Oracle) の列指向エンジンは、行指向ストレージエンジンの 100 倍以上となるクエリ性能を実現します。詳細については、「」「IMCI performance test results」をご参照ください。
仕組み
アーキテクチャの最適化
PolarDB for PostgreSQL (Compatible with Oracle) は、複雑なクエリをより効率的に処理するために、IMCI 機能の実行エンジンとストレージレイヤーの両方を最適化しています。
-
実行エンジンレイヤー
-
行指向ストレージエンジンとは異なり、ベクトル化実行エンジンは CPU の SIMD 命令を使用してデータをバッチで処理します。1 つの CPU 命令で複数行のデータを並列に処理できます。これにより、関数呼び出しに要する時間が短縮され、キャッシュミスの問題も抑制されます。
-
ベクトル化エンジンは、
Scan、Group By、Order By、Hash Join、Filter、Count、Sumなどのクエリ演算子を完全にベクトル化します。これにより、エンジンはバッチデータ入力を受け入れ、SIMD 命令を使用して処理できます。
-
-
ストレージレイヤー
-
ヒープの行指向ストレージ構造よりもベクトル化演算子に適した、列指向ストレージ形式を使用します。
-
列指向ストレージ形式はインデックスとして実装されており、これが IMCI です。IMCI は B-tree インデックスや GiST インデックスに似ていますが、ストレージ構造と適用シナリオが異なります。IMCI は直接使用できます。B-tree インデックスと GiST インデックスは行指向ストレージエンジンで使用されます。1 つのテーブルには、さまざまなクエリに対応するために IMCI と他の種類のインデックスの両方を含めることができます。PolarDB for PostgreSQL (Compatible with Oracle) のクエリオプティマイザは、クエリコストに基づいて最適なインデックスを選択します。
-
次の図に示すように、テーブル t のカラム c2 にはポイントクエリ (SELECT * FROM t WHERE c2=10) 用の B-tree インデックスを、カラム c4 と c5 には統計クエリ (SELECT c4, SUM(c5) FROM t GROUP BY c4) 用の IMCI を作成できます。クエリオプティマイザは、SQL 文のコストに基づいて、使用する最も効率的なインデックスを決定します。
リアルタイム行列同期
IMCI のデータは、データベース内に列指向形式で格納されます。データは最初に行指向テーブルに書き込まれ、その後、インデックス作成メカニズムを使用して IMCI に同期されます。このプロセスは行列同期と呼ばれます。PolarDB for PostgreSQL (Compatible with Oracle) の IMCI 機能は、効率的でリアルタイムかつ自動化された行列同期メカニズムを提供します。これにより、追加のパイプラインや列指向データの手動更新は不要になります。
行列同期メカニズムは、先行書き込みログ (WAL) を解析して変更されたデータを取得し、そのデータを IMCI に非同期で書き込みます。このプロセスが行指向ストレージエンジンの性能と負荷に与える影響は最小限であり、3% 未満です。PolarDB for PostgreSQL (Compatible with Oracle) の IMCI 機能は、同一ノード上で行指向ストレージエンジンと共存できるため、WAL 解析プロセスが最適化されています。行列変換プロセスは非同期ですが、書き込み負荷に応じて、数ミリ秒から数秒のレイテンシーでリアルタイム同期を実現できます。行列同期の最適化方法の詳細については、「」「Improve the real-time performance of IMCIs」をご参照ください。
製品形態
IMCI 機能は、PolarDB for PostgreSQL (Compatible with Oracle) クラスターにデプロイされたすべてのノードに適用されます。そのため、クラスター内のすべてのコンピューティングノードは、行指向ストレージエンジンと IMCI の両方を備えます。このモードでは、システムは SQL 文の実行時に次の判断を行います:
-
実行するコンピューティングノードを選択します。
-
ノード上で実行エンジンを選択します。
コンピューティングノードの選択
複数ノードを含む PolarDB クラスターで IMCI に関連する SQL 文を実行する場合、システムは実行するコンピューティングノードを選択する必要があります。
-
DDL (Data Definition Language) 文や DML (Data Manipulation Language) 文など、すべてのデータ変更文は読み書きノードで実行されます。読み書きノードは、その後、特定の条件に基づいて適切な実行エンジンを選択します。
-
読み書きノードは IMCI を作成し、そのリアルタイム同期を実行します。
-
すべての読み取り専用 SQL 文については、データベースプロキシを設定して、実行に使用するノードを決定できます。
実行エンジンの選択
コンピューティングノードは、SQL 文を実行する実行エンジンを選択します。
-
CREATE TABLEやALTER TABLEなどの DDL ステートメントでは、行指向ストレージエンジンが使用されます。ただし、CREATE TABLE AS SELECTステートメントの場合、システムはSELECTサブクエリの複雑さに基づいて IMCI を使用するかどうかを決定します。 -
INSERT、UPDATE、DELETEなどの DML 文には、行指向ストレージエンジンが使用されます。 -
SELECTのようなデータクエリ言語 (DQL) ステートメントに対しては、システムはクエリコストと特定のパラメーターに基づいて IMCI を使用するかどうかを決定します。通常、クエリコストが高いほど、IMCI が使用される可能性が高くなります。IMCI がSELECTステートメントの実行に失敗した場合、システムは行指向ストレージエンジンを使用してステートメントを再実行します。
主な機能とメリット
-
高性能
行指向ストレージエンジンと比較して、IMCI は SQL クエリ性能を大幅に向上させます。複雑なクエリの実行を、行指向ストレージエンジンと比べて 100 倍以上高速化できます。
-
高い費用対効果
-
クエリを最適化するために、テーブル全体ではなく関連する列に対して IMCI を作成できます。
-
IMCI は行指向インデックスよりも少ないストレージ容量しか占有しません。特定の列のデータ型によっては、IMCI が占有するストレージ容量は、行指向インデックスが占有するストレージ容量の 10% ~ 50% です。
-
-
使いやすさ
ベクトル化エンジンはネイティブの PostgreSQL と完全に互換性があり、同じ方法で使用できます。
-
IMCI は、PostgreSQL のネイティブインデックスのように管理でき、
CREATE INDEXやDROP INDEXなどのステートメントをサポートします。追加のステートメントは不要です。詳細については、「IMCI を有効にして使用する」をご参照ください。 -
IMCI は PostgreSQL のデータ型および構文との高い互換性を持ちます。既存の SQL 文を変更せずに、IMCI を使用して高速化できます。
-
すべての SQL 文、セッション内の SQL 文、またはヒント付きの特定の SQL 文など、どの SQL 文で IMCI を使用できるかをパラメータできめ細かく指定できます。詳細については、「」「Enable and use IMCIs」をご参照ください。
-
-
IMCI のリアルタイムメンテナンス
-
行指向データと IMCI の間のデータ整合性は自動的に維持されます。これにより、行指向データと列指向データの変換や手動同期を設定する必要はありません。
-
行指向テーブルに挿入されたデータは、数ミリ秒から数秒のレイテンシーで IMCI に同期されます。ビジネス負荷に基づいてデータ同期性能を調整できます。詳細については、「」「Enable and use IMCIs」をご参照ください。
-
-
整合性
IMCI と行指向データに関しては、さまざまなビジネス要件に対応するために次の整合性レベルが提供されます。
-
結果整合性 (デフォルト):書き込み負荷が高く、リアルタイム性の要件が低いクエリに適しています。
-
強い整合性:IMCI データと行指向データとの整合性が取れた後にクエリ結果を返します。詳細については、「」「Enable and use IMCIs」をご参照ください。
-
-
さまざまな使用方法との互換性
-
プリペアドステートメント構文をサポートします。 -
トランザクションブロック内の SELECT 文の高速化をサポートします。
説明SELECT 文は、トランザクションブロック内の read-before-write の SQL 文である必要があります。
-
パーティションテーブルおよび pg_pathman で管理されるパーティションテーブルをサポートします。パーティションプルーニングもサポートされます。詳細については、「」「Use IMCIs for partitioned tables」をご参照ください。
-
時空間マルチモーダルクエリの高速化をサポートします。
-
一般的なユースケース
PolarDB for PostgreSQL (Compatible with Oracle) の IMCI 機能は、さまざまなビジネスシナリオに適したワンストップのハイブリッドトランザクション/分析処理 (HTAP) 機能を提供します:
-
HTAP シナリオ:例えば、日々大量のトランザクション CRUD 操作を実行しながら、直近 1 時間のリアルタイムレポートも生成する必要がある場合です。PolarDB for PostgreSQL (Compatible with Oracle) の IMCI 機能は、両方のワークロードを効率的に処理するだけでなく、システムアーキテクチャも簡素化します。リアルタイム OLAP 分析クエリのために別システムを保守する必要はありません。
-
低速クエリの高速化:行指向ストレージエンジンで従来低速になりがちな次のようなクエリの高速化に最適です:
-
テーブル全体の集計 (
COUNT、SUM、AVG)。 -
複雑な
GROUP BYとORDER BY操作。 -
複数テーブルの
JOIN操作 -
複合インデックスでは柔軟に対応しにくい、動的なフィルタ条件を含むクエリ。
-
-
マルチモーダルおよび地理空間クエリ:ネストされた JSON データの効率的なクエリや、地理空間データの統計分析を実行できます。
-
ETL の高速化:IMCI の強力な計算能力を活用して、複雑なデータ変換と ETL プロセスをデータベース内で直接実行できます。
課金
IMCI は、行指向ノード上で直接実行することも、追加した IMCI 用の読み取り専用ノード上で実行することもできます。
-
既存ノードで IMCI を使用:無料です。
-
IMCI 専用の読み取り専用ノードを追加:追加のコンピューティングリソースに対して Standard compute node fees が適用されます。さらに、IMCI は追加のストレージ容量を消費するため、標準の storage fees が発生します。
ワークロードの分離
ワークロードを完全に分離するには、IMCI 専用の読み取り専用ノードを追加できます。これにより、分析処理 (AP) クエリがトランザクション処理 (TP) ワークロードの性能に影響を与えないようにできます。詳細については、「」「Impact on business」をご参照ください。