OceanBaseデータベースの高度な圧縮機能は、新設計された行列混合ストレージ構造と、効率的なデータエンコーディング技術および一連の包括的なデータ圧縮アルゴリズムを組み合わせた方法を採用しています。これにより、同じバックエンドを使用する圧縮シナリオにおいても、ストレージ容量を大幅に削減できます。
一般圧縮
一般圧縮とは、圧縮アルゴリズムがデータの内部構造を理解しない状態で、データブロックを直接圧縮することを指します。この種の圧縮は、一般的にバイナリデータの特性に基づいてエンコードし、保存データの冗長性を削減します。また、圧縮後のデータはランダムアクセスができず、圧縮および解凍はすべてデータブロック全体単位で行われます。データブロックの圧縮について、OceanBaseデータベースはzlib、snappy、lz4、zstdの4種類の圧縮アルゴリズムをサポートしています。zstdとlz4の圧縮レベルは1、zlibの圧縮レベルは6、snappyはデフォルトの圧縮レベルを使用します。OceanBaseデータベース内部で、デフォルトの16KBサイズのマイクロブロックに対する圧縮テストでは、snappyとlz4の圧縮速度は比較的速いものの、圧縮率は低めです。zlibとzstdは圧縮率が高いものの、圧縮速度はやや遅くなります。lz4とsnappyの圧縮率は似ていますが、lz4の方が圧縮・解凍速度が若干速いです。同様に、zstdの圧縮率はzlibと似ていますが、圧縮・解凍速度はどちらも速いです。
MySQLモードでは、ユーザーがzlib、snappy、lz4、またはzstdの圧縮アルゴリズムを個別に選択できます。Oracleモードでは、Oracleデータベースの圧縮オプションと互換性があり、ユーザーはlz4またはzstdの圧縮アルゴリズムのみを選択できます。
データエンコーディング
一般圧縮の基礎の上で、OceanBaseデータベースは、データベースに対して行列混合エンコーディングを行う独自の圧縮方法(encoding)を開発しました。一般圧縮とは異なり、Encodingは、圧縮アルゴリズムがデータブロック内部のデータ形式と意味を認識することを前提としています。OceanBaseデータベースはリレーショナルデータベースであり、データはテーブル形式で組織されています。テーブルの各列には固定の型があり、これにより同一列のデータには論理的に一定の類似性が保証されます。また、一部のシナリオでは、業務上のテーブルにおいて隣接する行間でもデータがより類似している場合があります。そのため、データを列ごとに圧縮してまとめて保存することで、より良い圧縮効果を得ることができます。そこでOceanBaseデータベースでは、encoding形式のマイクロブロックを導入しました。すべてのデータを逐一行ごとにブロック内に直列化するフラット形式のマイクロブロックとは異なり、encoding形式のマイクロブロックは行列混合形式です。論理的には依然として一連の行データがマイクロブロック内に存在しますが、マイクロブロックはデータを列ごとにエンコードします。エンコード後の固定長データはマイクロブロック内部のカラムストア領域に格納され、一部の可変長データは引き続き可変長領域に行ごとに格納されます。さらに、encodingマイクロブロックではデータへのランダムアクセスが可能であり、マイクロブロック内の特定の行データを読み取る際には、その行データのみを解凍すれば済むため、一部の解凍アルゴリズムで見られるように、データ全体を解凍する必要がなく、計算量の増大を回避できます。ベクトル化実行の過程でも指定された列のみを解凍できるため、投影処理のオーバーヘッドを低減できます。
OceanBaseデータベースは、データ分析の過程で適切なエンコーディングアルゴリズムを選択します。現在、OceanBaseデータベースは多様なデータエンコーディング技術をサポートしており、一般的で有効なエンコーディング手法は以下の通りです:
ディクショナリエンコーディング
カードナリティ(Cardinality)が小さいデータを重複除去した後、その重複除去後のデータを辞書として構築し、元のデータが格納されていた場所には、特定の辞書インデックスへの参照を格納します。さらに、辞書内の各データはタイプ順にソートされており、これによりデータ圧縮が容易になるだけでなく、計算時に述語を辞書に直接プッシュダウンし、二分論理による高速な反復処理を実現できます。
ラン・レングス・エンコーディング(Run-Length Encoding)またはRLEエンコーディング
続く等しいデータ、例えば:100、100、100、120、120、120、150、150、......について、連続するデータを重複除去し、開始行番号と値のみを保持します。
RLEエンコーディングは、データベースでは通常、カードナリティが低い連続データの処理に使用されます。例えば、インデックスプレフィックスやインデックスポストフィックスなどです。
インティジャル・デルタ・エンコーディング(Delta Encoding)
数値型エンコーディングであり、小さな値域に分布する整数型データに適しています。区間内の最小値と最大値を計算し、データから最小値を引いた後、より小さなビット幅でエンコードします。
コンスタントエンコーディング
最も一般的なデータをコンスタントとして認識し、このコンスタントと等しくないすべての異常値とそれらの行番号のみを記録します。
その他にも、OceanBaseデータベースは、文字列プレフィックスエンコーディング(Prefix Encoding)、16進数エンコーディング(Hex Encoding)、列間等値エンコーディング(Column Equal Encoding)、列間サブ文字列エンコーディング(Column SubString Encoding)など、多様なエンコーディング方式を提供しています。OceanBaseデータベースはメジャーコンパクション時にデータの特性に応じて適切なエンコーディングタイプを選択し、データの圧縮率を計算します。圧縮率が高くない場合は、迅速にロールバックして他のエンコーディング方式を選択することで、データエンコーディング処理が通常のデータ書き込み性能に影響を与えないようにします。データの特性を十分に理解している場合は、テーブル作成時に手動でエンコーディング方式を指定することも可能です。
詳細を見る
データ圧縮とデータエンコーディングの詳細については、圧縮とエンコーディングを参照してください。