Clickhouse 如何在外部存储器中进行分组Group By 设置配置项 max_bytes_before_external_group_by、max_memory_usage

当Clickhouse中查询的数据量太大,并且超过了可用内存的范围的话,可以通过启用在磁盘(或外部存储器)中进行分组,将临时数据转储到磁盘以限制内存使用期间的 GROUP BY。

该 max_bytes_before_external_group_by 可以设置触发的阈值,当RAM消耗超过这个阈值后, GROUP BY 会把多余的临时数据输出到文件系统并在磁盘进行处理计算。 如果设置为0(默认值),则是禁用。

使用时 max_bytes_before_external_group_by,建议设置 max_memory_usage 大约两倍高。 因为聚合有两个阶段:

  • (1)读取数据和形成中间数据
  • (2)合并中间数据。

将数据转储到文件系统只能在阶段1中发生。 如果未转储临时数据,则阶段2可能需要与阶段1相同的内存量。

例如,如果 max_memory_usage 设置为10000000000,你想使用外部聚合,可以设置 max_bytes_before_external_group_by 到 10000000000,并且设置 max_memory_usage 到 20000000000。 当触发外部聚合(如果至少有一个临时数据转储)时,RAM的最大消耗仅略高于 max_bytes_before_external_group_by.

通过分布式查询处理,在远程服务器上执行外部聚合。 为了使请求者服务器只使用少量的RAM,设置 distributed_aggregation_memory_efficient 到1。

当合并数据刷新到磁盘时,以及当合并来自远程服务器的结果时, distributed_aggregation_memory_efficient 设置被启用,消耗高达 1/256 * the_number_of_threads 从RAM的总量。

当启用外部聚合时,如果数据量小于 max_bytes_before_external_group_by (例如数据没有被 flushed), 查询执行速度和不在外部聚合的速度一样快. 如果临时数据被flushed到外部存储, 执行的速度会慢几倍 (大概是三倍).

如果你有一个 ORDER BY 用一个 LIMIT 后 GROUP BY,然后使用的RAM的量取决于数据的量 LIMIT,不是在整个表。 但如果 ORDER BY 没有 LIMIT,不要忘记启用外部排序 (max_bytes_before_external_sort).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天河书阁 VicRestart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值