時系列ストレージ効率
Wikipediaの統計データセットをクエリする方法を探った後は、ClickHouseでのストレージ効率の最適化に集中しましょう。このセクションでは、クエリパフォーマンスを維持しながらストレージ要件を削減するための実用的なテクニックを示します。
型の最適化
ストレージ効率を最適化する一般的なアプローチは、最適なデータ型を使用することです。project
およびsubproject
カラムを見てみましょう。これらのカラムはString型ですが、ユニークな値は比較的少ないです:
これは、辞書ベースのエンコーディングを使用するLowCardinality()データ型を使用できることを意味します。これにより、ClickHouseは元の文字列値の代わりに内部値IDを保存し、結果として多くのスペースを節約します:
また、hitsカラムにはUInt64型を使用しましたが、これは8バイトを取りますが、最大値は比較的小さいです:
この値を考慮すると、代わりにUInt32を使用でき、これにより最大値を約~4bまで保存できます:
これにより、このカラムのメモリにおけるサイズが少なくとも2倍に削減されます。圧縮のため、ディスク上のサイズは変更されないことに注意してください。しかし、小さすぎるデータ型を選ばないように注意してください!
専用コーデック
時系列のような連続データを扱うとき、特別なコーデックを使用することでストレージ効率をさらに改善できます。一般的なアイデアは、絶対値そのものではなく、値の変化を保存することです。これにより、ゆっくりと変化するデータを扱う際に必要なスペースが大幅に削減されます:
時刻カラムにはDeltaコーデックを使用しました。これは時系列データに適した選択です。
適切なソートキーを使用することもディスクスペースを節約できます。通常はパスでフィルタリングしたいので、ソートキーにpath
を追加します。これにはテーブルの再作成が必要です。
以下に、初期テーブルと最適化されたテーブルのCREATE
コマンドを示します:
それでは、各テーブルのデータが占めるスペースの量を見てみましょう:
最適化されたテーブルは、圧縮された形式でちょうど4倍以上のスペースを占めています。