概述
作为设置的一部分,ClickHouse 支持 对查询复杂度施加限制。这有助于防止 查询占用过多资源,从而让执行过程 更安全、也更可预测,尤其是在使用用户界面时。
几乎所有这些限制都只适用于 SELECT 查询;而在分布式
查询处理场景中,这些限制会在每台服务器上分别生效。
ClickHouse 通常只会在数据分区片段 完成处理后才检查这些限制,而不是对每一行都进行检查。这可能 导致在处理分区片段期间 就已经出现超出限制的情况。
overflow_mode 设置
大多数限制也都有 overflow_mode 设置,用于定义
超出限制时的处理方式,可取以下两个值之一:
throw:抛出异常 (默认) 。break:停止执行查询并返回部分结果,就像 源数据已耗尽一样。
当查询因 max_execution_time 且使用 break 而停止时,某些操作无法安全地返回
部分结果,因此会在不产生结果的情况下停止,而非返回较小的结果。计算单个值的函数会停止,
且不会产生该值;停止是否也会以 TIMEOUT_EXCEEDED 错误传达给客户端,还是仅表现为缺少结果,
取决于查询在何处被中断。因超时而未完成的 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 |
最小执行速度,以每秒行数计。 |
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 server 的最大并发会话数。 |
max_partitions_to_read |
限制单个查询可访问的最大分区数。 |
已废弃的设置
max_pipeline_depth
最大管道深度。它表示每个 数据块在查询处理过程中经历的转换次数。该值是在单个 服务器的限制范围内计算的。如果管道深度超过该值,则会抛出异常。