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).

你可能感兴趣的:(Clickhouse,clickhouse)