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 CHROMPARTITION BY CHROM,POS 会工作得更好。作为替代方案,您可以启用外部排序(请参阅max_bytes_before_external_sort)以在磁盘而不是内存上收集预先排序的数据。 @vladimir 是的 - 这确实有助于 CHROM 分区 - 谢谢!它仍然需要相当多的内存,但不会那么多。 【参考方案1】:

排序后的数据存储在分区范围内,因此,要对所有分区中的所有行进行排序,需要将整个内容加载到内存中,然后对其进行排序。

使用分区键作为 PARTITION BY CHROMPARTITION BY (CHROM, POS) 会更好。

作为替代方案,您可以启用外部排序(请参阅max_bytes_before_external_sort)以在磁盘而不是内存上收集预先排序的数据。

【讨论】:

以上是关于Clickhouse:按与表存储相同的顺序排列内存耗尽的主要内容,如果未能解决你的问题,请参考以下文章

ClickHouse 单机安装及基础知识与 Spark 应用

数据结构——1数组

如何为clickhouse创建索引?

如何在clickhouse中按时间顺序折叠相同的值行?

顺序表

稀疏数组