ClickHouse:MergeTree表排序列方向指定及性能影响问题
MergeTree表排序优化问题
问题描述
我正尝试优化一张MergeTree表,适配始终包含ORDER BY created_date DESC的查询,表结构如下。在CREATE TABLE的ORDER BY/PRIMARY KEY中加入created_date后,执行EXPLAIN发现存在ReverseTransform节点。我推测这会影响性能,因为列解压缩需要和压缩方向一致。但尝试在ORDER BY里加DESC没生效。
疑问
- 关于性能影响的推测是否正确?
- 怎么在
CREATE TABLE的ORDER BY里指定列的排序方向?
原建表语句
CREATE TABLE mytable ( `created_date` DateTime64(6, 'UTC') CODEC(Delta(8), ZSTD(1)), `type` LowCardinality(String), `stuff` String ) ENGINE = MergeTree ORDER BY (created_date, type); -- 注:这里加DESC不生效
解答
1. 性能影响的推测正确吗?
完全正确。ReverseTransform意味着ClickHouse需要在查询时对存储的created_date数据做反向排序操作,这会额外消耗CPU资源。尤其你给created_date用了Delta编码,这种编码依赖数据的连续递增特性,反向读取会打乱这种连续性,导致解压缩效率下降,进一步放大性能损耗。
2. 如何指定ORDER BY的列排序方向?
问题出在你用括号包裹了ORDER BY的字段列表——ClickHouse语法中,只有当字段列表不需要指定排序方向时才能用括号;如果要给列指定排序方向,必须把每个字段单独列出并标注方向,不能用括号包裹。正确的建表语句如下:
CREATE TABLE mytable ( `created_date` DateTime64(6, 'UTC') CODEC(Delta(8), ZSTD(1)), `type` LowCardinality(String), `stuff` String ) ENGINE = MergeTree ORDER BY created_date DESC, type;
如果需要给多个列指定方向,直接依次声明即可,比如:
ORDER BY created_date DESC, type ASC;
这样建表后,数据会按created_date降序、type升序的物理顺序存储,执行ORDER BY created_date DESC的查询时就不会出现ReverseTransform节点,查询性能会得到显著提升。
内容的提问来源于stack exchange,提问作者Martijn Thé
相关产品推荐
相关产品推荐

