Skip to main content

概述

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

overflow_mode 设置

大多数限制也都有 overflow_mode 设置,用于定义 超出限制时的处理方式,可取以下两个值之一:
  • throw:抛出异常 (默认) 。
  • break:停止执行查询并返回部分结果,就像 源数据已耗尽一样。
当查询因 max_execution_time 且使用 break 而停止时,某些操作无法安全地返回 部分结果,因此会在不产生结果的情况下停止,而非返回较小的结果。计算单个值的函数会停止, 且不会产生该值;停止是否也会以 TIMEOUT_EXCEEDED 错误传达给客户端,还是仅表现为缺少结果, 取决于查询在何处被中断。因超时而未完成的 Memory 表变更会保持表不变,并报告 TIMEOUT_EXCEEDEDINSERT 可能报告 QUERY_WAS_CANCELLED。某些等待其他副本或后台 工作的操作完全不会在 max_execution_time 时停止:法定人数写入会持续等待,直到满足其法定人数, 或者如果 insert_quorum_timeout 先到期,则报告 UNKNOWN_STATUS_OF_INSERT

group_by_overflow_mode 设置

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

设置列表

以下设置用于实施查询复杂度限制。
对“某项内容的最大值”的限制可以设为 0, 这表示其“不受限制”。

已废弃的设置

以下设置已废弃

max_pipeline_depth

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