メインコンテンツへスキップ
メインコンテンツへスキップ

Join テーブルエンジン

JOIN 演算で使用するための、オプションの事前構築済みデータ構造です。

注記

ClickHouse Cloud で、サービスがバージョン 25.4 より前に作成されている場合は、SET compatibility=25.4 を実行して、compatibility を少なくとも 25.4 に設定する必要があります。

テーブルの作成

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
) ENGINE = Join(join_strictness, join_type, k1[, k2, ...])

CREATE TABLE クエリの詳細については、説明を参照してください。

エンジンパラメータ

join_strictness

join_strictnessJOIN の厳密度

join_type

join_typeJOIN の種類

キー列

k1[, k2, ...]JOIN 演算が実行される際の、USING 句内のキー列。

join_strictness および join_type パラメータは、Join(ANY, LEFT, col1) のように引用符なしで指定します。これらは、そのテーブルが使用される JOIN 演算と一致していなければなりません。パラメータが一致しない場合でも、ClickHouse は例外をスローせず、誤ったデータを返す可能性があります。

詳細と推奨事項

データストレージ

Join テーブルのデータは常に RAM 上にあります。テーブルに行を挿入するとき、ClickHouse はデータブロックをディスク上のディレクトリに書き込み、サーバーの再起動時にそれらを復元できるようにします。

サーバーが異常終了したり正しくない手順で再起動された場合、ディスク上のデータブロックが失われたり破損したりすることがあります。この場合、破損したデータを含むファイルを手動で削除する必要が生じることがあります。

データの選択と挿入

INSERT クエリを使用して、Join エンジンのテーブルにデータを追加できます。テーブルが ANY 厳密度で作成されている場合、重複キーのデータは無視されます。ALL 厳密度では、すべての行が追加されます。

Join エンジンテーブルの主なユースケースは次のとおりです。

  • JOIN 句の右側にテーブルを配置する。
  • joinGet 関数を呼び出し、辞書と同じ方法でテーブルからデータを抽出する。

データの削除

Join エンジンテーブルに対する ALTER DELETE クエリは、mutation として実装されています。DELETE mutation はフィルタ済みのデータを読み取り、メモリおよびディスク上のデータを上書きします。

制限事項と設定

テーブル作成時には、次の設定が適用されます。

join_use_nulls

join_use_nulls

max_rows_in_join

max_rows_in_join

max_bytes_in_join

max_bytes_in_join

join_overflow_mode

join_overflow_mode

join_any_take_last_row

join_any_take_last_row

join_use_nulls

Persistent

Join および Set テーブルエンジンの永続化を無効にします。

I/O オーバーヘッドを削減します。性能を重視し、永続化を必要としないシナリオに適しています。

設定可能な値:

  • 1 — 有効。
  • 0 — 無効。

デフォルト値: 1

Join エンジンテーブルは GLOBAL JOIN 操作では使用できません。

Join エンジンでは、CREATE TABLE 文内で join_use_nulls 設定を指定できます。SELECT クエリでも同じ join_use_nulls の値を使用する必要があります。

使用例

左側テーブルの作成:

CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog;
INSERT INTO id_val VALUES (1,11)(2,12)(3,13);

右側の Join テーブルを作成する:

CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id);
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23);

テーブル結合:

SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id);
┌─id─┬─val─┬─id_val_join.val─┐
│  1 │  11 │              21 │
│  2 │  12 │               0 │
│  3 │  13 │              23 │
└────┴─────┴─────────────────┘

代わりに、結合キーの値を指定して Join テーブルからデータを取得することもできます。

SELECT joinGet('id_val_join', 'val', toUInt32(1));
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
│                                         21 │
└────────────────────────────────────────────┘

Join テーブルから行を削除する:

ALTER TABLE id_val_join DELETE WHERE id = 3;
┌─id─┬─val─┐
│  1 │  21 │
└────┴─────┘