系统资源的用量是按照单次查询统计的,而具体的熔断规则,则是由许多不同配置项组成的,这些配置项需要定义在用户 profile 中。如果某次查询使用的资源用量达到了阈值,则会被中断。ByteHouse 是以分区为最小单元进行统计的(不是数据行的粒度),这意味着单次查询的实际内存用量是有可能略微超过阈值的。
大多数限制有一个 overflow_mode
配置项,这意味着超过限制时该怎么做。 它可以采用以下两个值之一: throw
或 break
:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
以下介绍一组针对普通查询的熔断配置:
值为 0 时,可以执行任何查询。
如果值为1,则只能执行读取请求(如SELECT和SHOW)。
禁止写入和更改设置(插入,设置)的请求。 值为2时,可以处理读取查询(选择、显示)和更改设置(设置)。
启用只读模式后,您无法在当前会话中禁用它。
在HTTP接口中使用GET方法时, ‘readonly = 1’ 自动设置。 换句话说,对于修改数据的查询,您只能使用POST方法。 您可以在POST正文或URL参数中发送查询本身。
用于在单个服务器上运行查询的最大内存量。在默认配置文件中,最大值为10GB。
该设置不考虑计算机上的可用内存量或内存总量。 该限制适用于单个服务器中的单个查询。 您可以使用 SHOW PROCESSLIST
查看每个查询的当前内存消耗。 此外,还会跟踪每个查询的内存消耗峰值并将其写入日志。
该参数无法限制某些聚合函数的状态的内存使用情况。不完全限制部分聚合函数的状态的内存使用情况,如 min
, max
, any
, anyLast
, argMin
, argMax
。
用于在单个服务器上运行用户查询的最大内存量。
默认值定义在 Settings.h。默认情况下,数额不受限制 (max_memory_usage_for_user = 0
).
用于在单个服务器上运行所有查询的最大内存数量。
默认值定义在 Settings.h. 默认情况下,数额不受限制 (max_memory_usage_for_all_queries = 0
)。
可以在每个块(而不是每行)上检查以下限制。 也就是说,限制可能被超过。
运行查询时可从表中读取的最大行数。
运行查询时可以从表中读取的最大字节数(未压缩数据)。
读取的数据量超过其中一个限制时,可设置
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
从聚合接收的唯一密钥的最大数量。 此设置允许您在聚合时限制内存消耗。
当聚合的唯一键数超过限制时:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
any
- 允许您运行GROUP BY的近似值。 这种近似值的质量取决于数据的统计性质。
排序前的最大行数。
排序前的最大字节数。
如果排序前收到的行数超过其中一个限制:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
限制结果中的行数。
该限制同时检查子查询和分布式查询。
限制结果中的字节数。
如果结果超过其中一个限制,该怎么办:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
最大查询执行时间(以秒为单位)。
此时,不会检查其中一个排序阶段,也不会在合并和最终确定聚合函数时进行检查。
如果查询的运行时间长于 ‘max_execution_time’: ‘throw’ 或 ‘break’,默认值:throw。
以每秒行为单位的最小执行速度。 检查每个数据块时 ‘timeout_before_checking_execution_speed’ 到期。 如果执行速度较低,则会引发异常。
检查执行速度是不是太慢(不低于 ‘min_execution_speed’),在指定的时间以秒为单位已过期之后。
单个查询中可从表中读取的最大列数。 如果查询需要读取更多列,则会引发异常。
运行查询时必须同时保留在内存中的最大临时列数,包括常量列。 如果有比这更多的临时列,它会引发异常。
运行查询时必须同时保留在内存中的最大临时列数,但不包括常量列。
请注意,常量列在运行查询时经常形成,但它们基本不需要计算资源。
子查询的最大嵌套深度。 如果子查询更深,则会引发异常。 默认情况下,100。
最大管道深度。 对应于查询处理期间每个数据块经历的转换数。 在单个服务器的限制范围内计算。 如果管道深度较大,则会引发异常。 默认情况下,1000。
查询语法树的最大嵌套深度。 如果超出,将引发异常。 此时,在解析过程中不会对其进行检查,而是仅在解析查询之后进行检查。 也就是说,在分析过程中可以创建一个太深的语法树,但查询将失败。 默认情况下,1000。
查询语法树中的最大元素数。 如果超出,将引发异常。 与前面的设置相同,只有在解析查询后才会检查它。 默认情况下,50,000。
从子查询创建的IN子句中数据集的最大行数。
从子查询创建的IN子句中的集合使用的最大字节数(未压缩数据)。
当数据量超过其中一个限制时:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
使用DISTINCT时的最大不同行数。
使用DISTINCT时哈希表使用的最大字节数。
当数据量超过其中一个限制时:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
使用GLOBAL IN时,可以传递到远程服务器或保存在临时表中的最大行数。
使用GLOBAL IN时,可以传递到远程服务器或保存在临时表中的最大字节数(未压缩数据)。
当数据量超过其中一个限制时:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
在 join 查询时,限制哈希表中的行数。
在 join 查询时,限制哈希表中的大小。
当 join 数据量超过其中一个限制时:
throw
– 出错时抛出错误,查询停止(默认)
break
– 停止查询,返回已查询出的结果。
限制GROUP BY
使用额外内存。
可传参数:
非0 – GROUP BY
使用的额外内存大小。
0 – GROUP BY
禁用内存。(默认)