我的表中有数十亿行
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划分)是一种可以从分区“流式传输”所有数据并按顺序合并它们而无需太多内存的方法。
答案 0 :(得分:1)
排序的数据存储在分区范围内,因此,要对所有分区中的所有ROWS进行排序,需要将整个内容加载到内存中,然后再对其进行排序。
使用分区键作为 PARTITION BY CHROM 或 PARTITION BY(CHROM,POS)会更好。
作为替代方案,您可以启用外部排序(请参阅max_bytes_before_external_sort)以在磁盘而不是内存上收集预先排序的数据。