Clickhouse:按与 table 存储耗尽内存相同的顺序排序
Clickhouse: order by same order as table storage runs out of memory
我在 table
中有数十亿行
CREATE TABLE sample ( PN String,
CHROM String,
POS UInt32)
ENGINE = MergeTree
PARTITION BY PN
ORDER BY (CHROM, POS)
SETTINGS index_granularity = 8192;
每个 PN 大约有 500 万行
我想 return 所有行按 CHROM、POS
的顺序排列
select * from sample order by CHROM, POS
内存不足。
由于数据已经存储在 CHROM 中,POS 订单虽然被 PN 分区,但有一种方法可以 'stream' 分区中的所有数据并按顺序合并它们而不需要太多内存。
排序后的数据存储在分区范围内,因此,要对所有分区中的ALL ROWS进行排序,需要将全部内容加载到内存中,然后进行排序。
将分区键用作 PARTITION BY CHROM 或 PARTITION BY (CHROM, POS) 会更好。
作为替代方案,您可以启用外部排序(请参阅 max_bytes_before_external_sort)以在磁盘而非内存中收集 pre-sorted 数据。
我在 table
中有数十亿行CREATE TABLE sample ( PN String,
CHROM String,
POS UInt32)
ENGINE = MergeTree
PARTITION BY PN
ORDER BY (CHROM, POS)
SETTINGS index_granularity = 8192;
每个 PN 大约有 500 万行
我想 return 所有行按 CHROM、POS
的顺序排列 select * from sample order by CHROM, POS
内存不足。
由于数据已经存储在 CHROM 中,POS 订单虽然被 PN 分区,但有一种方法可以 'stream' 分区中的所有数据并按顺序合并它们而不需要太多内存。
排序后的数据存储在分区范围内,因此,要对所有分区中的ALL ROWS进行排序,需要将全部内容加载到内存中,然后进行排序。
将分区键用作 PARTITION BY CHROM 或 PARTITION BY (CHROM, POS) 会更好。
作为替代方案,您可以启用外部排序(请参阅 max_bytes_before_external_sort)以在磁盘而非内存中收集 pre-sorted 数据。