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

テーブルのパーツ

ClickHouse におけるテーブルパーツとは?


ClickHouse の MergeTree エンジンファミリー における各テーブルのデータは、変更不可能な data parts のコレクションとしてディスク上に整理されています。

これを示すために、イギリスの不動産価格データセットから適応した この テーブルを使用します。このテーブルは、イギリスで販売された不動産の売買日、町、通り、価格を追跡しています:

このテーブルを クエリ することができます。

データパートは、行のセットがテーブルに挿入されるたびに作成されます。次の図はこれを概略しています:

挿入処理

ClickHouse サーバーが上記の図に描かれた4行の例の挿入を処理する際、以下のいくつかのステップを実行します:

ソート: 行はテーブルのソートキー (town, street) でソートされ、ソートされた行に対して スパース主キー が生成されます。

分割: ソートされたデータはカラムに分割されます。

圧縮: 各カラムは 圧縮されます

ディスクへの書き込み: 圧縮されたカラムは、新しいディレクトリ内にバイナリカラムファイルとして保存されます。このディレクトリは挿入のデータパートを表します。スパース主キーも圧縮されて同じディレクトリに保存されます。

テーブルの特定のエンジンに応じて、ソートと共に追加の変換 が行われる場合があります

データパートは自己完結型であり、その内容を解釈するために必要なすべてのメタデータを中央カタログなしで含みます。スパース主キーの他に、パートは追加のメタデータを含んでおり、例えば、セカンダリの データスキッピングインデックスカラム統計、チェックサム、最小-最大インデックス(パーティション が使用されている場合)、および その他 が含まれます。

パートのマージ

テーブルごとのパーツ数を管理するために、バックグラウンドマージ ジョブが定期的に小さなパーツを大きなものに結合し、設定可能な圧縮サイズ(通常は約150 GB)に達するまで行います。マージされたパーツは非アクティブとしてマークされ、設定可能な 時間間隔の後に削除されます。時間が経つにつれて、このプロセスはマージされたパーツの階層構造を生み出し、これが MergeTree テーブルと呼ばれる理由です:

パートマージ

初期のパーツ数とマージのオーバーヘッドを最小限に抑えるために、データベースクライアントは 推奨されています 例えば、一度に20,000行のタプルを一括で挿入するか、非同期挿入モードを使用することです。このモードでは、ClickHouse は同じテーブルへの複数の受信挿入から行をバッファして、バッファサイズが設定可能な閾値を超えたとき、またはタイムアウトが切れたときにのみ新しいパートを作成します。

テーブルパーツの監視

クエリ を使用して、例のテーブルの現在存在するアクティブパーツのリストを取得することができます。ここでは 仮想カラム _part を使用します:

上記のクエリは、ディスク上のディレクトリ名を取得します。この各ディレクトリはテーブルのアクティブデータパートを表しています。これらのディレクトリ名の成分は特定の意味を持ち、詳細を探求したい方のために こちら に文書化されています。

あるいは、ClickHouse はすべてのテーブルのすべてのパーツに関する情報を system.parts システムテーブルで追跡し、次のクエリは 返します 上記の例のテーブルのすべての現在のアクティブパーツ、そのマージレベル、これらのパーツに保存されている行数のリスト:

マージレベルは、パートに対する各追加のマージごとに1ずつ増加します。レベル0は、まだマージされていない新しいパートを示します。