【发布时间】:2020-01-01 10:40:53
【问题描述】:
我使用 clickhouse 作为我的项目底层数据库及其MergeTree 表引擎。我正在尝试使用Custom Partitioning Key 功能,我创建了这样的表:
CREATE TABLE MyTable
(
UserID UUID,
ResourceID UUID,
TimeStamp DateTime,
Usage Int64,
Version UInt32
)
ENGINE = ReplacingMergeTree(Version)
PARTITION BY toYYYYMM(TimeStamp)
ORDER BY (toYYYYMMDD(TimeStamp), UserID, ResourceID , TimeStamp)
分区键是toYYYYMM(TimeStamp),这意味着clickhouse按月分隔数据。同时,我使用toYYYYMMDD(TimeStamp) 作为主索引的第一列。我提取了 1 年的数据(每月大约 30-40 百万行)进行测试。
当我使用TimeStamp 过滤条件查询数据时,我得到一些令人困惑的结果。这是我的 sql:
select count(*) from MyTable WHERE
TimeStamp>=toDateTime('2019-01-30 00:00:00')
and
TimeStamp<toDateTime('2019-02-04 00:00:00')
它处理了7562万行(1月和2月的全部数据)!这意味着查询条件可以命中正确的分区但错过了主键。但是如果手动转换TimeStamp,像这样:
select count(*) from MyTable WHERE
toYYYYMMDD(TimeStamp)>=toYYYYMMDD(toDateTime('2019-01-30 00:00:00'))
and
toYYYYMMDD(TimeStamp)<toYYYYMMDD(toDateTime('2019-02-04 00:00:00'))
然后它只处理了 700 万行(5-6 天的数据)。这意味着查询条件命中了主键。
让我困惑的是,既然 clickhouse 可以在不转换 TimeStamp 的情况下命中正确的分区,为什么它也不能自动命中主键?我真的需要手动转换时间戳吗?
【问题讨论】:
标签: primary-key partition clickhouse