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

時系列ストレージ効率

Wikipediaの統計データセットをクエリする方法を探った後は、ClickHouseでのストレージ効率の最適化に集中しましょう。このセクションでは、クエリパフォーマンスを維持しながらストレージ要件を削減するための実用的なテクニックを示します。

型の最適化

ストレージ効率を最適化する一般的なアプローチは、最適なデータ型を使用することです。projectおよびsubprojectカラムを見てみましょう。これらのカラムはString型ですが、ユニークな値は比較的少ないです:

これは、辞書ベースのエンコーディングを使用するLowCardinality()データ型を使用できることを意味します。これにより、ClickHouseは元の文字列値の代わりに内部値IDを保存し、結果として多くのスペースを節約します:

また、hitsカラムにはUInt64型を使用しましたが、これは8バイトを取りますが、最大値は比較的小さいです:

この値を考慮すると、代わりにUInt32を使用でき、これにより最大値を約~4bまで保存できます:

これにより、このカラムのメモリにおけるサイズが少なくとも2倍に削減されます。圧縮のため、ディスク上のサイズは変更されないことに注意してください。しかし、小さすぎるデータ型を選ばないように注意してください!

専用コーデック

時系列のような連続データを扱うとき、特別なコーデックを使用することでストレージ効率をさらに改善できます。一般的なアイデアは、絶対値そのものではなく、値の変化を保存することです。これにより、ゆっくりと変化するデータを扱う際に必要なスペースが大幅に削減されます:

時刻カラムにはDeltaコーデックを使用しました。これは時系列データに適した選択です。

適切なソートキーを使用することもディスクスペースを節約できます。通常はパスでフィルタリングしたいので、ソートキーにpathを追加します。これにはテーブルの再作成が必要です。

以下に、初期テーブルと最適化されたテーブルのCREATEコマンドを示します:

それでは、各テーブルのデータが占めるスペースの量を見てみましょう:

最適化されたテーブルは、圧縮された形式でちょうど4倍以上のスペースを占めています。