[go: up one dir, main page]

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

テーブルパーツ

ClickHouseにおけるテーブルパーツとは何ですか?


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

これを説明するために、このテーブル(UKの物件価格データセットから適応)を使用しており、イギリスで販売された物件の日時、町、通り、価格を追跡しています。

CREATE TABLE uk.uk_price_paid_simple
(
    date Date,
    town LowCardinality(String),
    street LowCardinality(String),
    price UInt32
)
ENGINE = MergeTree
ORDER BY (town, street);

このテーブルをクエリして、私たちのClickHouse SQL Playgroundで実行できます。

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


ClickHouseサーバーが上記の図にスケッチされた4行の例の挿入を処理する際(例えば、INSERT INTO文を介して)、いくつかのステップを実行します。

ソート: 行はテーブルの^^ソートキー^^ (town, street) によってソートされ、ソートされた行のための スパース主インデックスが生成されます。

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

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

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

テーブルの特定のエンジンによっては、ソートと並行して追加の変換 行われる場合があります。

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

パーツのマージ

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


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

テーブルパーツの監視

現在存在するアクティブな^^パーツ^^のすべてのリストを、仮想カラム _part を使用してクエリできます:

SELECT _part
FROM uk.uk_price_paid_simple
GROUP BY _part
ORDER BY _part ASC;

   ┌─_part───────┐
1. │ all_0_5_1   │
2. │ all_12_17_1 │
3. │ all_18_23_1 │
4. │ all_6_11_1  │
   └─────────────┘

上記のクエリは、ディスク上のディレクトリ名を取得し、それぞれのディレクトリがテーブルのアクティブデータパートを表します。これらのディレクトリ名の構成要素には特定の意味があり、詳細を探求したい方のためにここに記載されています。

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

SELECT
    name,
    level,
    rows
FROM system.parts
WHERE (database = 'uk') AND (`table` = 'uk_price_paid_simple') AND active
ORDER BY name ASC;

   ┌─name────────┬─level─┬────rows─┐
1. │ all_0_5_1   │     1 │ 6368414 │
2. │ all_12_17_1 │     1 │ 6442494 │
3. │ all_18_23_1 │     1 │ 5977762 │
4. │ all_6_11_1  │     1 │ 6459763 │
   └─────────────┴───────┴─────────┘

マージレベルは、パーツに追加のマージが行われるたびに1ずつ増加します。レベル0は、まだマージされていない新しいパートであることを示します。