跳至主要内容
跳至主要内容
编辑此页

查询复杂度限制

概述

作为 设置 的一部分,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_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 时该怎么做。
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定义当任何连接限制达到时 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所有并发运行的用户查询使用的磁盘上临时文件的最大数据量(以字节为单位)。
max_temporary_data_on_disk_size_for_query所有并发运行的查询使用的磁盘上临时文件的最大数据量(以字节为单位)。
max_sessions_for_user经过身份验证的用户到 ClickHouse 服务器的最大同时会话数。
max_partitions_to_read限制单个查询可以访问的最大分区数。

已弃用的设置

注意

以下设置已弃用

max_pipeline_depth

最大流水线深度。对应于数据块在查询处理过程中经过的转换次数。在单个服务器的限制范围内计算。如果流水线深度更大,则会抛出异常。

    © . This site is unofficial and not affiliated with ClickHouse, Inc.