> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-revert-104359-revert-104251-parquet-single.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 用于限制查询复杂度的设置。

# 查询复杂度限制

<div id="overview">
  ## 概述
</div>

作为[设置](/zh/concepts/features/configuration/settings/overview)的一部分，ClickHouse 支持
对查询复杂度施加限制。这有助于防止
查询占用过多资源，从而让执行过程
更安全、也更可预测，尤其是在使用用户界面时。

几乎所有这些限制都只适用于 `SELECT` 查询；而在分布式
查询处理场景中，这些限制会在每台服务器上分别生效。

ClickHouse 通常只会在数据分区片段
完成处理后才检查这些限制，而不是对每一行都进行检查。这可能
导致在处理分区片段期间
就已经出现超出限制的情况。

<div id="overflow_mode_setting">
  ## `overflow_mode` 设置
</div>

大多数限制也都有 `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`。

<div id="group_by_overflow_mode_settings">
  ## `group_by_overflow_mode` 设置
</div>

`group_by_overflow_mode` 设置还有
一个值 `any`：

* `any`：继续对已进入该集合的键进行聚合，但不再
  将新键添加到该集合中。

<div id="relevant-settings">
  ## 设置列表
</div>

以下设置用于实施查询复杂度限制。

<Note>
  对“某项内容的最大值”的限制可以设为 `0`，
  这表示其“不受限制”。
</Note>

| 设置项                                                                                                                                            | 简要说明                                                                                                     |
| ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| [`max_memory_usage`](/zh/reference/settings/session-settings/max-memory-usage#max_memory_usage)                                                | 在单台服务器上运行查询时可使用的最大 RAM 量。                                                                                |
| [`max_memory_usage_for_user`](/zh/reference/settings/session-settings/max-memory-usage#max_memory_usage_for_user)                              | 在单台服务器上运行某个用户的查询时可使用的最大 RAM 量。                                                                           |
| [`max_rows_to_read`](/zh/reference/settings/session-settings/max-rows#max_rows_to_read)                                                        | 运行查询时可从表中读取的最大行数。                                                                                        |
| [`max_bytes_to_read`](/zh/reference/settings/session-settings/max-bytes#max_bytes_to_read)                                                     | 运行查询时可从表中读取的最大字节数 (未压缩数据) 。                                                                              |
| [`read_overflow_mode_leaf`](/zh/reference/settings/session-settings/read-overflow-mode#read_overflow_mode_leaf)                                | 设置当读取的数据量超过某个叶子限制时的处理方式。                                                                                 |
| [`max_rows_to_read_leaf`](/zh/reference/settings/session-settings/max-rows#max_rows_to_read_leaf)                                              | 运行分布式查询时，在叶子节点上可从本地表中读取的最大行数。                                                                            |
| [`max_bytes_to_read_leaf`](/zh/reference/settings/session-settings/max-bytes#max_bytes_to_read_leaf)                                           | 运行分布式查询时，在叶子节点上可从本地表中读取的最大字节数 (未压缩数据) 。                                                                  |
| [`read_overflow_mode_leaf`](/zh/reference/settings/session-settings/read-overflow-mode#read_overflow_mode_leaf)                                | 设置当读取的数据量超过某个叶子限制时的处理方式。                                                                                 |
| [`max_rows_to_group_by`](/zh/reference/settings/session-settings/max-rows#max_rows_to_group_by)                                                | 聚合过程中接收到的唯一键的最大数量。                                                                                       |
| [`group_by_overflow_mode`](/zh/reference/settings/session-settings/group-by#group_by_overflow_mode)                                            | 设置当聚合使用的唯一键数量超过限制时的处理方式。                                                                                 |
| [`max_bytes_before_external_group_by`](/zh/reference/settings/session-settings/max-bytes#max_bytes_before_external_group_by)                   | 启用或禁用在外部内存中执行 `GROUP BY` 子句。                                                                             |
| [`max_bytes_ratio_before_external_group_by`](/zh/reference/settings/session-settings/max-bytes#max_bytes_ratio_before_external_group_by)       | `GROUP BY` 可使用的可用内存比例。达到该比例后，将使用外部内存进行聚合。                                                                |
| [`max_bytes_before_external_sort`](/zh/reference/settings/session-settings/max-bytes#max_bytes_before_external_sort)                           | 启用或禁用在外部内存中执行 `ORDER BY` 子句。                                                                             |
| [`max_bytes_ratio_before_external_sort`](/zh/reference/settings/session-settings/max-bytes#max_bytes_ratio_before_external_sort)               | `ORDER BY` 可使用的可用内存比例。达到该比例后，将使用外部排序。                                                                    |
| [`max_rows_to_sort`](/zh/reference/settings/session-settings/max-rows#max_rows_to_sort)                                                        | 排序前允许的最大行数。可用于限制排序时的内存消耗。                                                                                |
| [`max_bytes_to_sort`](/zh/reference/settings/session-settings/max-bytes#max_bytes_to_sort)                                                     | 排序前允许的最大字节数。                                                                                             |
| [`sort_overflow_mode`](/zh/reference/settings/session-settings/other#sort_overflow_mode)                                                       | 设置当排序前接收的行数超过某个限制时的处理方式。                                                                                 |
| [`max_result_rows`](/zh/reference/settings/session-settings/max-result#max_result_rows)                                                        | 限制结果中的行数。                                                                                                |
| [`max_result_bytes`](/zh/reference/settings/session-settings/max-result#max_result_bytes)                                                      | 限制结果大小 (按字节计，未压缩) 。                                                                                      |
| [`result_overflow_mode`](/zh/reference/settings/session-settings/other#result_overflow_mode)                                                   | 设置当结果量超过某个限制时的处理方式。                                                                                      |
| [`max_execution_time`](/zh/reference/settings/session-settings/max-execution#max_execution_time)                                               | 查询的最大执行时间 (秒) 。                                                                                          |
| [`timeout_overflow_mode`](/zh/reference/settings/session-settings/timeout-overflow-mode#timeout_overflow_mode)                                 | 设置当查询运行时间超过 `max_execution_time`，或预估运行时间超过 `max_estimated_execution_time` 时的处理方式 (仅在使用 `throw` 时检查预估值) 。 |
| [`max_execution_time_leaf`](/zh/reference/settings/session-settings/max-execution#max_execution_time_leaf)                                     | 语义上与 `max_execution_time` 类似，但仅适用于分布式查询或远程查询中的叶子节点。                                                      |
| [`timeout_overflow_mode_leaf`](/zh/reference/settings/session-settings/timeout-overflow-mode#timeout_overflow_mode_leaf)                       | 设置当叶子节点上的查询运行时间超过 `max_execution_time_leaf` 时的处理方式。                                                      |
| [`min_execution_speed`](/zh/reference/settings/session-settings/min-execution-speed#min_execution_speed)                                       | 最小执行速度，以每秒行数计。                                                                                           |
| [`min_execution_speed_bytes`](/zh/reference/settings/session-settings/min-execution-speed#min_execution_speed_bytes)                           | 最小执行速度，以每秒字节数计。                                                                                          |
| [`max_execution_speed`](/zh/reference/settings/session-settings/max-execution#max_execution_speed)                                             | 最大执行速度，以每秒行数计。                                                                                           |
| [`max_execution_speed_bytes`](/zh/reference/settings/session-settings/max-execution#max_execution_speed_bytes)                                 | 最大执行速度，以每秒字节数计。                                                                                          |
| [`timeout_before_checking_execution_speed`](/zh/reference/settings/session-settings/other#timeout_before_checking_execution_speed)             | 在经过指定的秒数后，检查执行速度是否过慢 (不低于 `min_execution_speed`) 。                                                       |
| [`max_estimated_execution_time`](/zh/reference/settings/session-settings/max#max_estimated_execution_time)                                     | 查询预估执行时间上限 (秒) 。                                                                                         |
| [`max_columns_to_read`](/zh/reference/settings/session-settings/max#max_columns_to_read)                                                       | 单个查询可从表中读取的最大列数。                                                                                         |
| [`max_temporary_columns`](/zh/reference/settings/session-settings/max-temporary#max_temporary_columns)                                         | 运行查询时必须同时保留在 RAM 中的最大临时列数，包括常量列。                                                                         |
| [`max_temporary_non_const_columns`](/zh/reference/settings/session-settings/max-temporary#max_temporary_non_const_columns)                     | 运行查询时必须同时保留在 RAM 中的最大临时列数，但不包括常量列。                                                                       |
| [`max_subquery_depth`](/zh/reference/settings/session-settings/max#max_subquery_depth)                                                         | 设置当查询中的嵌套子查询层数超过指定值时的处理方式。                                                                               |
| [`max_ast_depth`](/zh/reference/settings/session-settings/max-ast#max_ast_depth)                                                               | 查询语法树的最大嵌套深度。                                                                                            |
| [`max_ast_elements`](/zh/reference/settings/session-settings/max-ast#max_ast_elements)                                                         | 查询语法树中的最大元素数。                                                                                            |
| [`max_rows_in_set`](/zh/reference/settings/session-settings/max-rows#max_rows_in_set)                                                          | 由子查询生成的 IN 子句中的数据集最大行数。                                                                                  |
| [`max_bytes_in_set`](/zh/reference/settings/session-settings/max-bytes#max_bytes_in_set)                                                       | 由子查询生成的 IN 子句中的集合可使用的最大字节数 (按未压缩数据计) 。                                                                   |
| [`set_overflow_mode`](/zh/reference/settings/session-settings/other#set_overflow_mode)                                                         | 设置当数据量超出某项限制时的处理方式。                                                                                      |
| [`max_rows_in_distinct`](/zh/reference/settings/session-settings/max-rows#max_rows_in_distinct)                                                | 使用 DISTINCT 时，不同行的最大数量。                                                                                  |
| [`max_bytes_in_distinct`](/zh/reference/settings/session-settings/max-bytes#max_bytes_in_distinct)                                             | 使用 DISTINCT 时，内存中哈希表所使用状态的最大字节数 (按未压缩字节计) 。                                                              |
| [`distinct_overflow_mode`](/zh/reference/settings/session-settings/other#distinct_overflow_mode)                                               | 设置当数据量超出某项限制时的处理方式。                                                                                      |
| [`max_rows_to_transfer`](/zh/reference/settings/session-settings/max-rows#max_rows_to_transfer)                                                | 执行 GLOBAL IN/JOIN 部分时，可传递到远程服务器或保存到临时表中的最大大小 (按行数计) 。                                                    |
| [`max_bytes_to_transfer`](/zh/reference/settings/session-settings/max-bytes#max_bytes_to_transfer)                                             | 执行 GLOBAL IN/JOIN 部分时，可传递到远程服务器或保存到临时表中的最大字节数 (未压缩数据) 。                                                  |
| [`transfer_overflow_mode`](/zh/reference/settings/session-settings/other#transfer_overflow_mode)                                               | 设置当数据量超出某项限制时的处理方式。                                                                                      |
| [`max_rows_in_join`](/zh/reference/settings/session-settings/max-rows#max_rows_in_join)                                                        | 限制连接表时所用哈希表中的最大行数。                                                                                       |
| [`max_bytes_in_join`](/zh/reference/settings/session-settings/max-bytes#max_bytes_in_join)                                                     | 连接表时所用哈希表的最大大小 (按字节数计) 。                                                                                 |
| [`join_overflow_mode`](/zh/reference/settings/session-settings/join#join_overflow_mode)                                                        | 定义达到以下任一 join 限制时 ClickHouse 将执行的操作。                                                                     |
| [`max_partitions_per_insert_block`](/zh/reference/settings/session-settings/max-partitions#max_partitions_per_insert_block)                    | 限制单个插入块中的最大分区数；如果该块包含过多分区，则会抛出异常。                                                                        |
| [`throw_on_max_partitions_per_insert_block`](/zh/reference/settings/session-settings/throw-on#throw_on_max_partitions_per_insert_block)        | 允许控制达到 `max_partitions_per_insert_block` 时的行为。                                                           |
| [`max_temporary_data_on_disk_size_for_user`](/zh/reference/settings/session-settings/max-temporary#max_temporary_data_on_disk_size_for_user)   | 所有并发运行的用户查询在磁盘上由临时 File 消耗的最大数据量 (以字节为单位) 。                                                              |
| [`max_temporary_data_on_disk_size_for_query`](/zh/reference/settings/session-settings/max-temporary#max_temporary_data_on_disk_size_for_query) | 所有并发运行的查询在磁盘上由临时 File 消耗的最大数据量 (以字节为单位) 。                                                                |
| [`max_sessions_for_user`](/zh/reference/settings/session-settings/max#max_sessions_for_user)                                                   | 每个已通过身份验证的用户连接到 ClickHouse server 的最大并发会话数。                                                              |
| [`max_partitions_to_read`](/zh/reference/settings/session-settings/max-partitions#max_partitions_to_read)                                      | 限制单个查询可访问的最大分区数。                                                                                         |

<div id="obsolete-settings">
  ## 已废弃的设置
</div>

<Note>
  以下设置已废弃
</Note>

<div id="max-pipeline-depth">
  ### max\_pipeline\_depth
</div>

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