カラム圧縮
Dorisは列指向ストレージモデルを採用してデータを整理・保存しており、これは分析ワークロードに特に適しており、クエリ効率を大幅に向上させることができます。列指向ストレージでは、テーブルの各列が独立して保存され、圧縮技術の適用が促進され、ストレージ効率が向上します。Dorisは様々な圧縮アルゴリズムを提供し、ユーザーがワークロード要件に基づいて適切な圧縮方法を選択し、ストレージとクエリパフォーマンスを最適化できるようにしています。
なぜ圧縮が必要なのか
Dorisにおいて、データ圧縮には主に以下の2つの中核的な目標があります:
-
ストレージ効率の向上 圧縮により、データストレージに必要なディスク容量を大幅に削減でき、同じ物理リソースでより多くのデータを保存できるようになります。
-
パフォーマンスの最適化 圧縮されたデータの量は小さくなり、クエリ時に必要なI/O操作が少なくなるため、クエリレスポンス時間が短縮されます。現代の圧縮アルゴリズムは通常非常に高速な展開速度を持ち、ストレージ容量を削減しながら読み込み効率を向上させることができます。
サポートされている圧縮アルゴリズム
Dorisは様々な圧縮アルゴリズムをサポートしており、それぞれ圧縮率と展開速度の間で異なるトレードオフを持ち、ユーザーがニーズに基づいて適切なアルゴリズムを選択できるようになっています:
| 圧縮タイプ | 特徴 | 適用シナリオ |
|---|---|---|
| No Compression | - データに圧縮が適用されません。 | データが既に圧縮されている場合やストレージ容量が問題でない場合など、圧縮が不要なシナリオに適しています。 |
| LZ4 | - 非常に高速な圧縮・展開速度。 - 中程度の圧縮率。 | リアルタイムクエリや高並行ロードなど、展開速度要件が高いシナリオに適しています。 |
| LZ4F (LZ4 Frame) | - より柔軟な圧縮設定をサポートするLZ4の拡張版。 - 高速で中程度の圧縮率。 | 設定の細かな制御が必要で高速圧縮が要求される場合に必要です。 |
| LZ4HC (LZ4 High Compression) | - LZ4と比較してより高い圧縮率、ただし圧縮速度は遅い。 - 展開速度はLZ4と同等。 | より高い圧縮率が必要で、かつ展開速度に重点を置く場合に必要です。 |
| ZSTD (Zstandard) | - 柔軟な圧縮レベル調整を伴う高い圧縮率。 - 高い圧縮率でも展開速度は高速のまま。 | 高いストレージ効率要求がありながら、クエリパフォーマンスとのバランスが必要な場合に要求されます。 |
| Snappy | - 高速な展開のために設計されている。 - 中程度の圧縮率。 | 高い展開速度と低いCPUオーバーヘッド要求があるシナリオに要求されます。 |
| Zlib | - 圧縮率と速度の良いバランス。 - 他のアルゴリズムと比較して圧縮・展開速度は遅いが、より高い圧縮率。 | 高いストレージ効率要求があり、展開速度に対して鈍感なシナリオ(アーカイブやコールドデータストレージなど)に要求されます。 |
圧縮原理
列圧縮 列指向ストレージの採用により、Dorisはテーブル内の各列を独立して圧縮できます。この方法は、同じ列内のデータが類似した分布特性を持つことが多いため、圧縮効率を向上させます。
圧縮前のエンコーディング データを圧縮する前に、Dorisは列データをエンコードし(例:辞書エンコーディング、ランレングスエンコーディングなど)、データを圧縮により適した形式に変換し、圧縮効率をさらに向上させます。
Storage Format V3の最適化
Doris Storage Format V3以降、数値型のエンコーディング戦略がさらに最適化されました。整数型にはデフォルトでPLAIN_ENCODINGを使用し、LZ4/ZSTDと組み合わせることで、より高い読み込みスループットと低いCPUオーバーヘッドを提供します。詳細については、Storage Format V3を参照してください。
ページ圧縮 Dorisはpageレベルの圧縮戦略を採用しています。各列のデータは複数のページに分割され、各ページ内のデータが独立して圧縮されます。ページ単位で圧縮することで、Dorisは高い圧縮率と展開パフォーマンスを確保しながら、大規模データセットを効率的に処理できます。
設定可能な圧縮戦略 ユーザーはテーブル作成時に使用する圧縮アルゴリズムを指定できます。この柔軟性により、ユーザーは特定のワークロードに基づいて圧縮効率とパフォーマンスの間で最適な選択を行うことができます。
圧縮効果に影響する要因
異なる圧縮アルゴリズムにはそれぞれ利点と欠点がありますが、圧縮の効果は選択されたアルゴリズムだけでなく、以下の要因にも依存します:
データの順序
データの順序は圧縮効果に大きな影響を与えます。順次性の高い列(例:タイムスタンプや連続した数値列)では、圧縮アルゴリズムは通常より良い結果を達成できます。データの順序がより規則的であるほど、圧縮時に圧縮アルゴリズムがより多くの反復パターンを識別でき、圧縮率が向上します。
データの冗長性
データ列内の重複値が多いほど、圧縮効果がより顕著になります。例えば、重複値に辞書エンコーディングを使用することで、ストレージ容量を大幅に削減できます。しかし、明らかな重複のないデータ列では、圧縮効果が期待に沿わない可能性があります。
データタイプ
データのタイプも圧縮効果に影響を与えることがあります。一般的に、数値データタイプ(整数や浮動小数点数など)は文字列データタイプよりも圧縮しやすいです。値の範囲が広いデータタイプでは、圧縮アルゴリズムの効果が影響を受ける可能性があります。
列の長さ
列内のデータの長さも圧縮効果に影響を与えることがあります。短い列は通常、長い列よりも圧縮しやすくなります。圧縮アルゴリズムが短いデータブロックでより効率的に反復パターンを見つけることができるためです。
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"
);