跳转到主要内容

概述

作为设置的一部分,ClickHouse 支持 对查询复杂度施加限制。这有助于防止 查询占用过多资源,从而让执行过程 更安全、也更可预测,尤其是在使用用户界面时。 几乎所有这些限制都只适用于 SELECT 查询;而在分布式 查询处理场景中,这些限制会在每台服务器上分别生效。 ClickHouse 通常只会在数据分区片段 完成处理后才检查这些限制,而不是对每一行都进行检查。这可能 导致在处理分区片段期间 就已经出现超出限制的情况。

overflow_mode 设置

大多数限制也都有 overflow_mode 设置,用于定义 超出限制时的处理方式,可取以下两个值之一:
  • throw:抛出异常 (默认) 。
  • break:停止执行查询并返回部分结果,就像 源数据已耗尽一样。

group_by_overflow_mode 设置

group_by_overflow_mode 设置还有 一个值 any
  • any:继续对已进入该集合的键进行聚合,但不再 将新键添加到该集合中。

设置列表

以下设置用于实施查询复杂度限制。
对“某项内容的最大值”的限制可以设为 0, 这表示其“不受限制”。
设置项简要说明
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_byGROUP BY 可使用的可用内存比例。达到该比例后,将使用外部内存进行聚合。
max_bytes_before_external_sort启用或禁用在外部内存中执行 ORDER BY 子句。
max_bytes_ratio_before_external_sortORDER 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 时的处理方式。
max_execution_time_leaf在语义上与 max_execution_time 类似,但仅适用于分布式或远程查询中的叶子节点。
timeout_overflow_mode_leaf设置当叶子节点上的查询运行时间超过 max_execution_time_leaf 时的处理方式。
min_execution_speed最低执行速度,以每秒行数计。
min_execution_speed_bytes最低执行速度,以每秒字节数计。
max_execution_speed最高执行速度,以每秒行数计。
max_execution_speed_bytes最高执行速度,以每秒字节数计。
timeout_before_checking_execution_speed在指定秒数过去后,检查执行速度是否过慢 (不低于 min_execution_speed) 。
max_estimated_execution_time查询预估执行时间上限,以秒为单位。
max_columns_to_read单个查询可从一张表中读取的最大列数。
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限制单个插入块中的最大分区数;如果块中包含过多分区,则会抛出异常。
throw_on_max_partitions_per_insert_block允许控制达到 max_partitions_per_insert_block 时的行为。
max_temporary_data_on_disk_size_for_user所有并发运行的用户查询在磁盘上由临时 File 消耗的最大数据量 (以字节为单位) 。
max_temporary_data_on_disk_size_for_query所有并发运行的查询在磁盘上由临时 File 消耗的最大数据量 (以字节为单位) 。
max_sessions_for_user每个已认证用户连接到 ClickHouse 服务器的最大并发会话数。
max_partitions_to_read限制单个查询中可访问的最大分区数。

已废弃的设置

以下设置已废弃

max_pipeline_depth

最大管道深度。它表示每个 数据块在查询处理过程中经历的转换次数。该值是在单个 服务器的限制范围内计算的。如果管道深度超过该值,则会抛出异常。
最后修改于 2026年6月10日