メインコンテンツまでスキップ
に最終更新

データ圧縮

Doris はデータを列指向ストレージモデルで整理・保存します。このモデルは分析ワークロードに特に適しています。同じ列のデータは分布特性が似ていることが多いため、列指向ストレージには圧縮しやすいという利点があります。Doris には複数の圧縮アルゴリズムが組み込まれており、テーブルの作成時にワークロードに適したものを選んで、ストレージコストとクエリ性能のバランスを調整できます。

圧縮アルゴリズムの選択ガイド​

ワークロードによって圧縮に求められる特性は異なります。次の表に、一般的なシナリオで推奨される選択肢を示します。

利用シナリオ推奨アルゴリズム理由
高性能なリアルタイム分析、高い同時実行数のクエリLZ4、Snappy展開が非常に速く、CPU 負荷が低い
ストレージコストとクエリ性能のバランスを重視ZSTD、LZ4F高い圧縮率を保ちながら、高速に展開できる
ストレージ効率を優先し、クエリのレイテンシーは重視しないZSTD、Zlib圧縮率が最も高く、ディスク容量を節約できる
アーカイブやコールドデータの保存Zlib、LZ4HC圧縮率を最大化でき、アクセス頻度の低いデータに適している

基本的には ZSTD を推奨します。多くのシナリオで、高い圧縮率と速い展開速度を両立できます。

圧縮が必要な理由​

Doris でデータを圧縮する主な目的は、次の二つです。

  1. ストレージコストの削減:データの保存に必要なディスク容量を減らし、同じ物理リソースにより多くのデータを保存します。
  2. クエリ性能の向上:圧縮されたデータは占有容量が小さいため、クエリ実行時の I/O 回数を減らせます。最新の圧縮アルゴリズムは非常に高速に展開できるため、ストレージを節約しながらクエリの応答も速くできます。

サポートされる圧縮アルゴリズム​

Doris は次の圧縮アルゴリズムをサポートします。アルゴリズムごとに、圧縮率と展開速度のバランスが異なります。

圧縮方式特性適用シナリオ
圧縮なしデータを圧縮しません。データがすでに圧縮されている場合や、ストレージ容量がボトルネックにならない場合。
LZ4圧縮と展開が非常に速く、圧縮率は中程度です。リアルタイムクエリ、同時実行数の多いワークロードなど、高速な展開が必要な場合。
LZ4FLZ4 の拡張版で、圧縮設定をより柔軟に調整できます。速度が速く、圧縮率は中程度です。設定を細かく制御しながら、高速に圧縮する必要がある場合。
LZ4HCLZ4 より圧縮率が高い一方で、圧縮速度は遅くなります。展開速度は LZ4 と同程度です。展開速度を維持しつつ、より高い圧縮率が必要な場合。
ZSTD(Zstandard)圧縮率が高く、圧縮レベルを柔軟に調整できます。高い圧縮率でも展開は高速です。高いストレージ効率と良好なクエリ性能の両方が必要な場合。
Snappy主に高速な展開を目的として設計されており、圧縮率は中程度です。高速な展開が必要で、CPU リソースが限られている場合。
Zlib圧縮率と速度のバランスが良好です。圧縮と展開は遅いものの、圧縮率は高くなります。アーカイブ、コールドデータの保存など、展開速度が重要でない場合。

圧縮の仕組み​

Doris では、複数の処理層が連携して圧縮を実現します。

列単位の圧縮​

Doris は列指向ストレージを使用するため、テーブルの各列を個別に圧縮します。同じ列のデータは分布特性が似ていることが多く、列単位の圧縮では行単位の圧縮より高い圧縮効率が得られます。

圧縮前のエンコーディング​

Doris は圧縮前に列データをエンコードし、圧縮に適した形式に変換して圧縮率をさらに高めます。一般的なエンコーディング方式には、次のものがあります。

  • 辞書エンコーディング:繰り返し現れる文字列を、短い辞書 ID に置き換えます。
  • ランレングスエンコーディング(RLE):連続して繰り返される値を「値 + 繰り返し回数」で表します。

ページ単位の圧縮​

Doris はページ単位で圧縮します。

  1. 各列のデータを複数のページに分割します。
  2. 各ページ内のデータを個別に圧縮します。
  3. クエリ時には対象のページだけを必要に応じて展開し、列全体のスキャンを避けます。

ページ単位の圧縮により、大規模なデータセットを効率的に扱いながら、圧縮率と展開性能のバランスを維持できます。

ストレージフォーマット V3 の最適化​

Doris のストレージフォーマット V3 以降では、数値型のエンコーディング方式がさらに最適化されています。

  • 整数型では、デフォルトで PLAIN_ENCODING を使用します。
  • LZ4 または ZSTD による圧縮と組み合わせると、読み取りスループットが向上し、CPU 負荷が低下します。

詳細は、ストレージフォーマット V3を参照してください。

設定可能な圧縮方式​

テーブルの作成時に圧縮アルゴリズムを指定し、ワークロードに応じて圧縮効率とクエリ性能のバランスを選択できます。

圧縮に影響する要因​

圧縮の効果は、選択したアルゴリズムだけでなく、データ自体の特性にも左右されます。

要因説明
データの連続性タイムスタンプや連続する数値など、データの並びが規則的であるほど、圧縮アルゴリズムが繰り返しパターンを見つけやすくなり、圧縮率が高くなります。
データの冗長性列に同じ値が多いほど圧縮効果が高まります。特に、冗長性の高いデータには辞書エンコーディングが有効です。
データ型数値型(整数、浮動小数点数)は通常、文字列型より圧縮しやすくなります。値の範囲が広いほど、圧縮への影響が大きくなります。
列の長さ短い列は通常、長い列より圧縮しやすくなります。短いデータブロックでは、圧縮アルゴリズムが繰り返しパターンをより効率的に見つけられるためです。
NULL 値の割合NULL 値の割合が高い場合、圧縮アルゴリズムはそれらを特別なパターンとしてエンコードし、ストレージ容量をさらに削減できます。

Doris での圧縮設定​

テーブルの作成時に、compression パラメータを PROPERTIES で指定して圧縮アルゴリズムを設定します。

CREATE TABLE example_table (
id INT,
name STRING,
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"compression" = "zstd"
);

compression に指定できる値は、none、lz4、lz4f、lz4hc、zstd、snappy、zlib です。明示的に指定しない場合、Doris はデフォルトの圧縮アルゴリズムである ZSTD を使用します(FE 設定の default_compression_type で制御されます)。