分区键应该包含在 ORDER BY 或 PRIMARY 列表中吗?

问题描述 投票:0回答:1

我正在 Clickhouse 数据库中创建一个新表,例如:

CREATE TABLE IF NOT EXISTS `sensor_reading`
(
  test_day          Date,
  sensor            String,
  ts                DateTime,
  speed             Int32,
  weight            Int32, 
)
ENGINE=MergeTree()
PARTITION BY test_day
ORDER BY (test_day, sensor, ts)
PRIMARY KEY (test_day, sensor, ts);

sensor
的值空间比
test_day
低得多,我想将它用作第1个主键,因此clickhouse可以通过二分搜索对其进行索引。既然表是按
test_day
分区的,是否还需要将其放入
ORDER BY
PRIMARY KEY
列表中呢?应该改成
ORDER BY (sensor, ts)
还是
ORDER BY (sensor, test_day, ts)

编辑:我的大多数查询都带有过滤器,例如

WHERE test_day = '2024-10-01' AND sensor = 'A' AND ts BETWEEN ...

clickhouse
1个回答
0
投票

不,

PARTITION BY
可能是完全不同的字段,与
ORDER BY
PRIMARY KEY
中的
CREATE TABLE

子句无关

在 INSERT 期间使用 PARTITION BY 子句将行拆分为不同的数据部分,不同分区中的数据部分永远不会合并

在 SELECT 过程中使用 PARTITION BY 子句来快速过滤与查询无关的数据部分,以避免不必要的磁盘读取

https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/ 欲知详情

© www.soinside.com 2019 - 2024. All rights reserved.