メインコンテンツまでスキップ

カラム圧縮

Dorisはカラム型ストレージモデルを採用してデータを整理・保存しており、これは分析ワークロードに特に適しており、クエリ効率を大幅に向上させることができます。カラム型ストレージでは、テーブルの各列が独立して保存されるため、圧縮技術の適用が促進され、ストレージ効率が向上します。Dorisは様々な圧縮アルゴリズムを提供しており、ユーザーはワークロードの要件に基づいて適切な圧縮方法を選択し、ストレージとクエリのパフォーマンスを最適化できます。

圧縮が必要な理由

Dorisにおいて、データ圧縮には主に以下の2つの中核的な目的があります:

  1. ストレージ効率の向上 圧縮により、データ保存に必要なディスク容量を大幅に削減でき、同じ物理リソースでより多くのデータを保存できるようになります。

  2. パフォーマンスの最適化 圧縮されたデータの容量は小さく、クエリ時に必要なI/O操作が少なくなるため、クエリの応答時間が短縮されます。現代の圧縮アルゴリズムは通常、非常に高速な展開速度を持ち、ストレージ容量を削減しながら読み取り効率を向上させることができます。

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

Dorisは様々な圧縮アルゴリズムをサポートしており、それぞれが圧縮率と展開速度の間で異なるトレードオフを持っているため、ユーザーはニーズに基づいて適切なアルゴリズムを選択できます:

圧縮タイプ特徴適用シナリオ
No Compression- データに圧縮を適用しない圧縮が不要なシナリオに適している。データが既に圧縮されている場合や、ストレージ容量が問題にならない場合など
LZ4- 非常に高速な圧縮・展開速度
- 中程度の圧縮率
展開速度の要件が高いシナリオに適している。リアルタイムクエリや高並行負荷など
LZ4F (LZ4 Frame)- より柔軟な圧縮設定をサポートするLZ4の拡張版
- 高速で中程度の圧縮率
設定を細かく制御しながら高速圧縮が必要な場合
LZ4HC (LZ4 High Compression)- LZ4と比較してより高い圧縮率だが、圧縮速度は遅い
- 展開速度はLZ4と同等
より高い圧縮率が必要で、かつ展開速度を重視する場合
ZSTD (Zstandard)- 柔軟な圧縮レベル調整が可能な高圧縮率
- 高圧縮率でも展開速度は高速
高いストレージ効率の要求があり、クエリパフォーマンスとのバランスが必要な場合
Snappy- 高速展開を目的とした設計
- 中程度の圧縮率
高速展開と低CPU負荷の要求が高いシナリオに必要
Zlib- 圧縮率と速度の良好なバランス
- 他のアルゴリズムと比較して圧縮・展開速度は遅いが、より高い圧縮率
高いストレージ効率の要求があり、展開速度に敏感でないシナリオに必要。アーカイブやコールドデータストレージなど

圧縮の原理

カラム圧縮 カラム型ストレージの採用により、Dorisはテーブル内の各列を独立して圧縮できます。この方法は、同じ列内のデータがしばしば類似した分散特性を持つため、圧縮効率を向上させます。

圧縮前のエンコーディング データを圧縮する前に、Dorisは列データをエンコード(例:dictionary encodingrun-length encodingなど)し、データをより圧縮に適した形に変換することで、圧縮効率をさらに向上させます。

Page圧縮 Dorisはpageレベルの圧縮戦略を採用しています。各列のデータは複数のページに分割され、各ページ内のデータは独立して圧縮されます。ページ単位で圧縮することにより、Dorisは大規模データセットを効率的に処理でき、高い圧縮率と展開パフォーマンスを確保できます。

設定可能な圧縮戦略 ユーザーはテーブル作成時に使用する圧縮アルゴリズムを指定できます。この柔軟性により、ユーザーは特定のワークロードに基づいて圧縮効率とパフォーマンスの間で最適な選択を行えます。

圧縮効果に影響する要因

異なる圧縮アルゴリズムがそれぞれ独自の利点と欠点を持つものの、圧縮の効果は選択されたアルゴリズムだけでなく、以下の要因にも依存します:

データの順序

データの順序は圧縮効果に重大な影響を与えます。順序性の高い列(例:タイムスタンプや連続的な数値列)については、圧縮アルゴリズムは通常より良い結果を達成できます。データの順序がより規則的であればあるほど、圧縮アルゴリズムは圧縮時により多くの反復パターンを識別でき、圧縮率が向上します。

データの冗長性

データ列の重複値が多いほど、圧縮効果はより顕著になります。例えば、重複値にdictionary encodingを使用すると、ストレージ容量を大幅に削減できます。しかし、明らかな重複のないデータ列については、圧縮効果が期待に応えない可能性があります。

データタイプ

データのタイプも圧縮効果に影響を与える可能性があります。一般的に、数値データタイプ(整数や浮動小数点数など)は文字列データタイプよりも圧縮しやすいです。値の範囲が広いデータタイプについては、圧縮アルゴリズムの効果が影響を受ける可能性があります。

列の長さ

列内データの長さも圧縮効果に影響を与える可能性があります。短い列は通常、長い列よりも圧縮しやすく、これは圧縮アルゴリズムが短いデータブロック内でより効率的に反復パターンを見つけられるためです。

Null値

列内のnull値の割合が高い場合、圧縮アルゴリズムはより効果的である可能性があります。これらのnull値を特別なパターンとしてエンコードでき、ストレージ容量を削減できるためです。

適切な圧縮アルゴリズムの選択方法

適切な圧縮アルゴリズムの選択は、ワークロードの特性に基づくべきです:

  • 高パフォーマンスリアルタイム分析シナリオの場合、LZ4またはSnappyの使用を推奨します。
  • ストレージ効率を優先するシナリオの場合、ZSTDまたはZlibの使用を推奨します。
  • 速度と圧縮率のバランスを必要とするシナリオの場合、LZ4Fを選択できます。
  • アーカイブやコールドデータストレージシナリオの場合、ZlibまたはLZ4HCの使用が推奨されます。

Dorisでの圧縮設定

テーブル作成時に圧縮アルゴリズムを指定して、データの保存方法を決定できます:

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