Clickhouse:按与表存储相同的顺序排列内存耗尽
Posted
技术标签:
【中文标题】Clickhouse:按与表存储相同的顺序排列内存耗尽【英文标题】:Clickhouse: order by same order as table storage runs out of memory 【发布时间】:2019-06-06 11:28:35 【问题描述】:我的表中有数十亿行
CREATE TABLE sample ( PN String,
CHROM String,
POS UInt32)
ENGINE = MergeTree
PARTITION BY PN
ORDER BY (CHROM, POS)
SETTINGS index_granularity = 8192;
每个 PN 大约有 500 万行
我想按 CHROM、POS 的顺序返回所有行
select * from sample order by CHROM, POS
这会耗尽内存。
由于数据已经存储在 CHROM 中,POS 订单虽然由 PN 分区,但有一种方法可以“流式传输”来自分区的所有数据并按顺序合并它们而无需太多内存。
【问题讨论】:
排序后的数据存储在分区范围内,因此,要对所有分区中的所有行进行排序,需要将整个内容加载到内存中,然后对其进行排序。可能将分区键用作 PARTITION BY CHROM 或 PARTITION BY CHROM,POS 会工作得更好。作为替代方案,您可以启用外部排序(请参阅max_bytes_before_external_sort)以在磁盘而不是内存上收集预先排序的数据。 @vladimir 是的 - 这确实有助于 CHROM 分区 - 谢谢!它仍然需要相当多的内存,但不会那么多。 【参考方案1】:排序后的数据存储在分区范围内,因此,要对所有分区中的所有行进行排序,需要将整个内容加载到内存中,然后对其进行排序。
使用分区键作为 PARTITION BY CHROM 或 PARTITION BY (CHROM, POS) 会更好。
作为替代方案,您可以启用外部排序(请参阅max_bytes_before_external_sort)以在磁盘而不是内存上收集预先排序的数据。
【讨论】:
以上是关于Clickhouse:按与表存储相同的顺序排列内存耗尽的主要内容,如果未能解决你的问题,请参考以下文章