データ管理のための手法パーティション化は本質的にはデータ管理のための手法であり、クエリ最適化ツールではありません。特定のワークロードではパフォーマンス向上につながる場合もありますが、クエリを高速化するための第一の手段とすべきではありません。パーティションキーは、その影響を十分に理解したうえで慎重に選ぶ必要があり、データライフサイクルの要件や、明確に把握されたアクセスパターンに合致する場合にのみ適用すべきです。
PARTITION BY 句を使って定義し、一般に、時間インターバル、カテゴリ、その他の業務上重要な次元ごとに行をグループ化するために使用されます。パーティション化式の値が一意であるごとに、ディスク上にそれぞれ独立した物理パーティションが作成され、ClickHouse は各値に対応するデータを別々のパーツに保存します。パーティション化により、データ管理が改善され、保持ポリシーが簡素化されるほか、特定のクエリパターンで効果を発揮することがあります。
たとえば、パーティションキーとして toStartOfMonth(date) を使用する、次の UK price paid データセットテーブルを考えてみましょう。
toStartOfMonth(date) ごとに分割します。次に、特定された各パーティションについて、行は通常どおり処理されます。この処理では、いくつかの連続したステップ (① ソート、② カラムへの分割、③ 圧縮、④ ディスクへの書き込み) が実行されます。
パーティション化の詳細については、このガイドを参照することをおすすめします。
パーティション化を有効にすると、ClickHouse はパーティションをまたいでではなく、パーティション内でのみ データパーツ をマージします。これを上記の例のテーブルで示すと、次のようになります。
パーティション化の用途
低カーディナリティのパーティションキーを選択する
toStartOfMonth(date) でパーティション化されている場合、月でフィルタすると、エンジンは無関係なパーティションとそのパーツを完全にスキップできます。
パーティション化は一部のクエリパターンではパフォーマンス向上に役立つことがありますが、主な目的はデータ管理です。多くの場合、すべてのパーティションをまたぐクエリは、データの断片化が進み、スキャン対象のパーツも増えるため、パーティション化されていないテーブルより遅くなることがあります。パーティション化は慎重に使用し、選択するキーが必ず低カーディナリティで、かつデータライフサイクルポリシー (たとえば 有効期限 (TTL) による保持) に合っていることを常に確認してください。パーティション化が本当に必要か確信が持てない場合は、まずは使わずに始め、実際のアクセスパターンを見てから後で最適化するとよいでしょう。