概要
ClickHouse では、設定の一部として、 クエリの複雑さに制限を設けることができます。これにより、 リソースを大量に消費する可能性のあるクエリから保護し、より安全で予測可能な 実行を実現できます。特に、ユーザーインターフェイスを使用する場合に有効です。
これらの制限のほとんどは SELECT クエリにのみ適用され、分散
クエリ処理では、各サーバーに個別に適用されます。
ClickHouse では通常、各行ごとに制限を確認するのではなく、データパーツが 完全に処理された後でのみ制限を確認します。このため、 パーツの処理中に制限を超過してしまう 可能性があります。
overflow_mode 設定
ほとんどの制限には overflow_mode 設定もあり、制限を超えたときにどうなるかを定義します。指定できる値は次の 2 つです:
throw: 例外をスローします (デフォルト) 。break: クエリの実行を停止し、部分的な結果を返します。これは、 入力データが尽きた場合と同じです。
break を指定した max_execution_time によってクエリが停止された場合、一部の操作では
部分的な結果を安全に返すことができないため、より少ない結果を返す代わりに、結果を生成せずに停止します。単一の値を
計算する関数は、その値を生成せずに停止します。停止が TIMEOUT_EXCEEDED エラーとしても
client に到達するか、結果が欠落するだけかは、クエリが中断された場所によって異なります。タイムアウトによって未完了のままとなった Memory テーブルのミューテーションではテーブルは変更されず、
TIMEOUT_EXCEEDED が報告されます。INSERT では QUERY_WAS_CANCELLED が報告される場合があります。他の
レプリカまたはバックグラウンド作業を待機する一部の操作は、そもそも max_execution_time で停止しません。クォーラム
書き込みはクォーラムが満たされるまで待機を続けるか、先に
insert_quorum_timeout が経過した場合は UNKNOWN_STATUS_OF_INSERT を報告します。
group_by_overflow_mode の設定
group_by_overflow_mode 設定には、
値 any もあります。
any: セットに入ったキーについては集約を継続しますが、 セットに新しいキーは追加しません。
設定一覧
以下の設定は、クエリの複雑さに関する制限を適用するために使用されます。
| 設定 | 概要 |
|---|---|
max_memory_usage |
単一サーバーでクエリを実行する際に使用できる RAM の最大量。 |
max_memory_usage_for_user |
単一サーバーでユーザーのクエリを実行する際に使用できる RAM の最大量。 |
max_rows_to_read |
クエリ実行時にテーブルから読み取れる行数の上限。 |
max_bytes_to_read |
クエリ実行時にテーブルから読み取れるバイト数 (非圧縮データ) の上限。 |
read_overflow_mode_leaf |
読み取ったデータ量がリーフ側のいずれかの制限を超えた場合の動作を設定します。 |
max_rows_to_read_leaf |
分散クエリ実行時に、リーフノード上のローカルテーブルから読み取れる行数の上限。 |
max_bytes_to_read_leaf |
分散クエリ実行時に、リーフノード上のローカルテーブルから読み取れるバイト数 (非圧縮データ) の上限。 |
read_overflow_mode_leaf |
読み取ったデータ量がリーフ側のいずれかの制限を超えた場合の動作を設定します。 |
max_rows_to_group_by |
集約で生成される一意なキー数の上限。 |
group_by_overflow_mode |
集約の一意なキー数が制限を超えた場合の動作を設定します。 |
max_bytes_before_external_group_by |
外部メモリでの GROUP BY 句の実行を有効または無効にします。 |
max_bytes_ratio_before_external_group_by |
GROUP BY に使用できる利用可能メモリの比率。これに達すると、集約に外部メモリが使用されます。 |
max_bytes_before_external_sort |
外部メモリでの ORDER BY 句の実行を有効または無効にします。 |
max_bytes_ratio_before_external_sort |
ORDER BY に使用できる利用可能メモリの比率。これに達すると、外部ソートが使用されます。 |
max_rows_to_sort |
ソート前の行数の上限。ソート時のメモリ消費を制限できます。 |
max_bytes_to_sort |
ソート前のバイト数の上限。 |
sort_overflow_mode |
ソート前に受信した行数がいずれかの制限を超えた場合の動作を設定します。 |
max_result_rows |
結果の行数を制限します。 |
max_result_bytes |
結果サイズをバイト単位 (非圧縮) で制限します。 |
result_overflow_mode |
結果のデータ量がいずれかの制限を超えた場合の動作を設定します。 |
max_execution_time |
クエリの最大実行時間 (秒) 。 |
timeout_overflow_mode |
クエリの実行時間が max_execution_time を超えた場合、または推定実行時間が max_estimated_execution_time を超える場合の動作を設定します (推定値は throw の場合にのみ確認されます) 。 |
max_execution_time_leaf |
意味的には max_execution_time と同様ですが、分散クエリまたはリモートクエリではリーフノードにのみ適用されます。 |
timeout_overflow_mode_leaf |
リーフノード上のクエリの実行時間が max_execution_time_leaf を超えた場合の動作を設定します。 |
min_execution_speed |
最小実行速度 (1 秒あたりの行数) 。 |
min_execution_speed_bytes |
1 秒あたりの実行バイト数の下限。 |
max_execution_speed |
1 秒あたりの実行行数の上限。 |
max_execution_speed_bytes |
1 秒あたりの実行バイト数の上限。 |
timeout_before_checking_execution_speed |
指定した秒数が経過した後、実行速度が遅すぎないこと (min_execution_speed を下回らないこと) を確認します。 |
max_estimated_execution_time |
クエリの推定実行時間の上限 (秒) 。 |
max_columns_to_read |
1つのクエリでテーブルから読み取れるカラムの最大数。 |
max_temporary_columns |
定数カラムを含め、クエリ実行時に同時にRAMに保持する必要がある一時カラムの最大数。 |
max_temporary_non_const_columns |
クエリ実行時に同時にRAMに保持する必要がある一時カラムの最大数。ただし、定数カラムは含みません。 |
max_subquery_depth |
クエリ内でネストされたサブクエリの数が指定値を超えた場合の動作を設定します。 |
max_ast_depth |
クエリ構文木の最大ネスト深度。 |
max_ast_elements |
クエリ構文木内の要素の最大数。 |
max_rows_in_set |
サブクエリから作成されたIN句内のデータセットの最大行数。 |
max_bytes_in_set |
サブクエリから作成されたIN句内のセットで使用される最大バイト数 (非圧縮データ) 。 |
set_overflow_mode |
データ量がいずれかの制限を超えた場合の動作を設定します。 |
max_rows_in_distinct |
DISTINCT使用時の異なる行の最大数。 |
max_bytes_in_distinct |
DISTINCT使用時にハッシュテーブルが使用するメモリ内状態の最大サイズ (非圧縮バイト数) 。 |
distinct_overflow_mode |
データ量がいずれかの制限を超えた場合の動作を設定します。 |
max_rows_to_transfer |
GLOBAL IN/JOINの実行時に、リモートサーバーに渡す、または一時テーブルに保存できる最大サイズ (行数) 。 |
max_bytes_to_transfer |
GLOBAL IN/JOINの実行時に、リモートサーバーに渡す、または一時テーブルに保存できる最大バイト数 (非圧縮データ) 。 |
transfer_overflow_mode |
データ量がいずれかの制限を超えた場合の動作を設定します。 |
max_rows_in_join |
テーブル結合時に使用されるハッシュテーブル内の行数を制限します。 |
max_bytes_in_join |
テーブル結合時に使用されるハッシュテーブルの最大サイズ (バイト数) 。 |
join_overflow_mode |
以下のjoin制限のいずれかに達したときにClickHouseが実行する動作を定義します。 |
max_partitions_per_insert_block |
1つの挿入ブロック内のパーティションの最大数を制限し、ブロックに含まれるパーティション数が多すぎる場合は例外がスローされます。 |
throw_on_max_partitions_per_insert_block |
max_partitions_per_insert_block に達したときの動作を制御できます。 |
max_temporary_data_on_disk_size_for_user |
同時実行中のそのユーザーのすべてのクエリについて、ディスク上の一時ファイルが消費できるデータ量の最大値 (バイト単位) 。 |
max_temporary_data_on_disk_size_for_query |
同時実行中のすべてのクエリについて、ディスク上の一時ファイルが消費できるデータ量の最大値 (バイト単位) 。 |
max_sessions_for_user |
認証済みユーザーごとのClickHouseサーバーへの同時セッション数の上限。 |
max_partitions_to_read |
1つのクエリでアクセスできるパーティションの最大数を制限します。 |
廃止された設定
max_pipeline_depth
パイプラインの最大深度。各データブロックがクエリ処理中に通過する 変換の数に対応します。単一サーバーの範囲内でカウントされます。 パイプラインの深度がこれを超えると、例外がスローされます。