You need to enable JavaScript to run this app.
导航

查询熔断配置

最近更新时间2023.05.30 11:57:22

首次发布时间2022.12.19 15:11:00

系统资源的用量是按照单次查询统计的,而具体的熔断规则,则是由许多不同配置项组成的,这些配置项需要定义在用户 profile 中。如果某次查询使用的资源用量达到了阈值,则会被中断。ByteHouse 是以分区为最小单元进行统计的(不是数据行的粒度),这意味着单次查询的实际内存用量是有可能略微超过阈值的。
大多数限制有一个 overflow_mode 配置项,这意味着超过限制时该怎么做。 它可以采用以下两个值之一: throwbreak

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

以下介绍一组针对普通查询的熔断配置:

只读 query-complexity-readonly

  • 值为 0 时,可以执行任何查询。

  • 如果值为1,则只能执行读取请求(如SELECT和SHOW)。

  • 禁止写入和更改设置(插入,设置)的请求。 值为2时,可以处理读取查询(选择、显示)和更改设置(设置)。

启用只读模式后,您无法在当前会话中禁用它。
在HTTP接口中使用GET方法时, ‘readonly = 1’ 自动设置。 换句话说,对于修改数据的查询,您只能使用POST方法。 您可以在POST正文或URL参数中发送查询本身。

内存限制

max_memory_usage

用于在单个服务器上运行查询的最大内存量。在默认配置文件中,最大值为10GB。
该设置不考虑计算机上的可用内存量或内存总量。 该限制适用于单个服务器中的单个查询。 您可以使用 SHOW PROCESSLIST 查看每个查询的当前内存消耗。 此外,还会跟踪每个查询的内存消耗峰值并将其写入日志。
该参数无法限制某些聚合函数的状态的内存使用情况。不完全限制部分聚合函数的状态的内存使用情况,如 min, max, any, anyLast, argMin, argMax

max_memory_usage_for_user

用于在单个服务器上运行用户查询的最大内存量。
默认值定义在 Settings.h。默认情况下,数额不受限制 (max_memory_usage_for_user = 0).

max_memory_usage_for_all_queries

用于在单个服务器上运行所有查询的最大内存数量。
默认值定义在 Settings.h. 默认情况下,数额不受限制 (max_memory_usage_for_all_queries = 0)。

读取行数限制

max_rows_to_read

可以在每个块(而不是每行)上检查以下限制。 也就是说,限制可能被超过。
运行查询时可从表中读取的最大行数。

max_bytes_to_read

运行查询时可以从表中读取的最大字节数(未压缩数据)。

read_overflow_mode

读取的数据量超过其中一个限制时,可设置

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

max_rows_to_group_by

从聚合接收的唯一密钥的最大数量。 此设置允许您在聚合时限制内存消耗。

聚合/排序限制

group_by_overflow_mode

当聚合的唯一键数超过限制时:

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

  • any - 允许您运行GROUP BY的近似值。 这种近似值的质量取决于数据的统计性质。

max_rows_to_sort

排序前的最大行数。

max_bytes_to_sort

排序前的最大字节数。

sort_overflow_mode

如果排序前收到的行数超过其中一个限制:

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

行数限制

max_result_rows

限制结果中的行数。
该限制同时检查子查询和分布式查询。

max_result_bytes

限制结果中的字节数。

result_overflow_mode

如果结果超过其中一个限制,该怎么办:

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

查询时间限制:

max_execution_time

最大查询执行时间(以秒为单位)。
此时,不会检查其中一个排序阶段,也不会在合并和最终确定聚合函数时进行检查。

timeout_overflow_mode

如果查询的运行时间长于 ‘max_execution_time’: ‘throw’ 或 ‘break’,默认值:throw。

查询速率限制

min_execution_speed

以每秒行为单位的最小执行速度。 检查每个数据块时 ‘timeout_before_checking_execution_speed’ 到期。 如果执行速度较低,则会引发异常。

timeout_before_checking_execution_speed

检查执行速度是不是太慢(不低于 ‘min_execution_speed’),在指定的时间以秒为单位已过期之后。

列读取限制
max_columns_to_read

单个查询中可从表中读取的最大列数。 如果查询需要读取更多列,则会引发异常。

max_temporary_columns

运行查询时必须同时保留在内存中的最大临时列数,包括常量列。 如果有比这更多的临时列,它会引发异常。

max_temporary_non_const_column

运行查询时必须同时保留在内存中的最大临时列数,但不包括常量列。
请注意,常量列在运行查询时经常形成,但它们基本不需要计算资源。

查询深度限制

max_subquery_depth

子查询的最大嵌套深度。 如果子查询更深,则会引发异常。 默认情况下,100。

max_pipeline_depth

最大管道深度。 对应于查询处理期间每个数据块经历的转换数。 在单个服务器的限制范围内计算。 如果管道深度较大,则会引发异常。 默认情况下,1000。

max_ast_depth

查询语法树的最大嵌套深度。 如果超出,将引发异常。 此时,在解析过程中不会对其进行检查,而是仅在解析查询之后进行检查。 也就是说,在分析过程中可以创建一个太深的语法树,但查询将失败。 默认情况下,1000。

max_ast_elements

查询语法树中的最大元素数。 如果超出,将引发异常。 与前面的设置相同,只有在解析查询后才会检查它。 默认情况下,50,000。

Set 查询限制

max_rows_in_set

从子查询创建的IN子句中数据集的最大行数。

max_bytes_in_set

从子查询创建的IN子句中的集合使用的最大字节数(未压缩数据)。

set_overflow_mode

当数据量超过其中一个限制时:

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

Distinct 查询限制

max_rows_in_distinct

使用DISTINCT时的最大不同行数。

max_bytes_in_distinct

使用DISTINCT时哈希表使用的最大字节数。

distinct_overflow_mode

当数据量超过其中一个限制时:

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

Global in 查询限制

max_rows_to_transfer

使用GLOBAL IN时,可以传递到远程服务器或保存在临时表中的最大行数。

max_bytes_to_transfer

使用GLOBAL IN时,可以传递到远程服务器或保存在临时表中的最大字节数(未压缩数据)。

transfer_overflow_mode

当数据量超过其中一个限制时:

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

Join 查询限制

max_rows_in_join

在 join 查询时,限制哈希表中的行数。

max_bytes_in_join

在 join 查询时,限制哈希表中的大小。

join_overflow_mode

当 join 数据量超过其中一个限制时:

  • throw – 出错时抛出错误,查询停止(默认)

  • break – 停止查询,返回已查询出的结果。

max_bytes_before_external_group_by

限制GROUP BY使用额外内存。
可传参数:

  • 非0 – GROUP BY 使用的额外内存大小。

  • 0 – GROUP BY 禁用内存。(默认)