JOIN演算で使用するためのオプションの事前準備済みデータ構造です。
テーブルの作成
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
) ENGINE = Join(join_strictness, join_type, k1[, k2, ...])CREATE TABLE クエリの詳細な説明をご覧ください。
エンジンパラメータ
join_strictness
join_strictness – JOIN strictness.
join_type
join_type – JOINの種類.
キーカラム
k1[, k2, ...] – JOIN 操作で使用する USING 句のキーカラムです。
join_strictness と join_type パラメーターは、たとえば Join(ANY, LEFT, col1) のようにクォートなしで指定します。これらは、そのテーブルを使用する JOIN 操作と一致している必要があります。パラメーターが一致していない場合、ClickHouse は例外を送出せず、不正確なデータを返すことがあります。
詳細と推奨事項
データの保存
Join テーブルのデータは常に RAM 上にあります。テーブルに行を挿入すると、サーバーの再起動時に復元できるよう、ClickHouse はデータブロックをディスク上のディレクトリに書き込みます。
サーバーが正常に再起動されなかった場合、ディスク上のデータブロックが失われたり破損したりすることがあります。その場合は、破損したデータを含むファイルを手動で削除する必要があることがあります。
データの選択と挿入
Join エンジンのテーブルにデータを追加するには、INSERT クエリを使用できます。テーブルが ANY strictness で作成されている場合、重複するキーのデータは無視されます。ALL strictness の場合は、すべての行が追加されます。
Join エンジンのテーブルの主な用途は次のとおりです。
JOIN句の右側にテーブルを配置する。- joinGet 関数を呼び出して、Dictionary から取得するのと同じようにテーブルからデータを抽出する。
データの削除
Join エンジンのテーブルに対する ALTER DELETE クエリは、ミューテーション として実装されています。DELETE ミューテーションは、フィルタされたデータを読み取り、メモリ上およびディスク上のデータを上書きします。
制限事項と設定
テーブルの作成時には、次の設定が適用されます:
join_use_nulls
max_rows_in_join
max_bytes_in_join
join_overflow_mode
join_any_take_last_row
join_use_nulls
永続化
Join および Set テーブルエンジンの永続化を無効にします。
I/O のオーバーヘッドを削減します。パフォーマンスを重視し、永続化が不要なシナリオに適しています。
設定可能な値:
- 1 — 有効。
- 0 — 無効。
デフォルト値: 1。
Join エンジンのテーブルは、GLOBAL JOIN 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キーの値を指定して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 │
└────┴─────┘