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形式のマイクロブロックを導入しました。すべてのデータを行ごとに連続的にブロックにシリアライズするflat形式のマイクロブロックとは異なり、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データベースは、メジャーコンパクション時にデータの特性に応じて適切なエンコーディングタイプを選択し、データの圧縮率を計算します。圧縮率が高くない場合は、速やかにロールバックして他のエンコーディング方式を選択し、データエンコーディングのプロセスが通常のデータ書き込み性能に影響を与えないようにします。データの特性について十分に理解している場合は、テーブル作成時に手動でエンコーディング方式を指定することもできます。
詳細情報
データ圧縮とデータエンコーディングの詳細については、圧縮とエンコーディングを参照してください。