join_algorithm
- grace_hash
grace_hash_join_initial_buckets です) 。これは、各 bucket を独立して処理できるようにするためです。最初の bucket の行はインメモリの hash table に追加され、それ以外はディスクに保存されます。hash table がメモリ制限 (たとえば max_bytes_in_join で設定) を超えるまで大きくなった場合は、bucket 数が増やされ、各行の割り当て先 bucket が変更されます。現在の bucket に属さない行はフラッシュされ、再割り当てされます。
INNER/LEFT/RIGHT/FULL ALL/ANY JOIN をサポートします。
- hash
JOIN ON 句で OR によって結合された複数の結合キーをサポートする、最も汎用的な実装です。
hash アルゴリズムを使用する場合、JOIN の右側は RAM に読み込まれます。
- parallel_hash
hash join の一種で、データを buckets に分割し、1 つではなく複数の hashtables を並行して構築することで、この処理を高速化します。
parallel_hash アルゴリズムを使用する場合、JOIN の右側は RAM に読み込まれます。
- partial_merge
RIGHT JOIN と FULL JOIN は ALL strictness の場合にのみサポートされます (SEMI、ANTI、ANY、ASOF はサポートされません) 。
partial_merge アルゴリズムを使用する場合、ClickHouse はデータをソートしてディスクに書き出します。ClickHouse の partial_merge アルゴリズムは、従来の実装とはやや異なります。まず、ClickHouse は右テーブルを結合キーで blocks 単位にソートし、ソート済み blocks に対して min-max 索引を作成します。次に、左テーブルの各 part を join key でソートし、それらを右テーブルと結合します。不要な右テーブル blocks をスキップするためにも min-max 索引が使用されます。
- direct
direct (nested loop とも呼ばれます) アルゴリズムは、左テーブルの行をキーとして右テーブルをルックアップします。
Dictionary、EmbeddedRocksDB、MergeTree テーブルなどの特別なストレージでサポートされています。
MergeTree テーブルでは、このアルゴリズムは結合キーフィルタをストレージ層に直接プッシュダウンします。キーでテーブルの primary key index を使ってルックアップできる場合は、より効率的になることがあります。そうでない場合は、左テーブルの各 block ごとに右テーブル全体をフルスキャンします。
INNER と LEFT joins のみをサポートし、他の条件を含まない単一カラムの等価結合キーにのみ対応します。
- auto
auto に設定すると、まず hash join を試し、メモリ制限を超えた場合は実行中に別のアルゴリズムへ切り替えます。
- full_sorting_merge
- prefer_partial_merge
partial_merge join を使用し、そうでない場合は hash を使用します。非推奨であり、partial_merge,hash と同じです。
- default (deprecated)
direct,hash と同じです。つまり、direct join と hash join をこの順で使用しようとします。
join_any_take_last_row
ANY strictness を持つ JOIN演算の動作を変更します。
この設定は、
Join エンジンのテーブルと、ハッシュベースの JOIN アルゴリズムに適用されます。JOIN が並列に構築される場合、行の順序は非決定論的になることがあります。つまり、join_any_take_last_row = 1 を設定すると、ANY JOIN クエリで非決定論的な行が返される可能性があります。- 0 — 右テーブルに一致する行が複数ある場合、最初に見つかった 1 行だけが結合されます。
- 1 — 右テーブルに一致する行が複数ある場合、最後に見つかった 1 行だけが結合されます。
join_default_strictness
ALL— 右テーブルに一致する行が複数ある場合、ClickHouse は一致した行のデカルト積を作成します。これは Standard SQL における通常のJOINの動作です。ANY— 右テーブルに一致する行が複数ある場合、最初に見つかった 1 行だけを結合します。右テーブルに一致する行が 1 行しかない場合、ANYとALLの結果は同じです。ASOF— あいまいな一致条件で数列を結合する場合に使用します。Empty string— クエリでALLまたはANYが指定されていない場合、ClickHouse では例外がスローされます。
join_on_disk_max_files_to_merge
- 2以上の任意の正の整数。
join_output_by_rowlist_perkey_rows_threshold
join_overflow_mode
join_algorithm の値が
hash または parallel_hash の場合のみです。その他の
アルゴリズム (たとえば partial_merge、grace_hash、auto) では、これらの
制限は異なる方法で処理されます。たとえば、ディスクへのスピル、再パーティション化、または
戦略の切り替えです。詳しくは
join_algorithm を参照してください。
設定可能な値:
THROW— ClickHouse は例外をスローしてクエリを停止します。BREAK— ClickHouse はクエリを停止し、例外はスローしません。
THROW。
関連項目